- /*
- * 10、 金额转换,阿拉伯数字转换成中国传统形式。
- * 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
- */
- /*
- * 分析:
- * 1,要实现金额转换,首先要有数字,从键盘输入一个double类型的数字
- * 2,在处理数字时不仅仅要将阿拉伯数字转换成传统格式,而且还要注意单位,每4位是一个
- * 进制单位,如圆,万,亿,万亿
- * 3,同时对输入的数字处理要考虑到整数和小数两个部分,在整数部分的处理中,还需要注意
- * 连续多个零的情况,根据我们平时的习惯我们不会在整数部分读出所有零,我们一般都是
- * 只读一个零,其他的省略
- * 4,为了方便转换,我们可以把输入的double类型的小数*100转成整数,然后切割字符串,
- * 对整数部分和小数部分再分别进行处理
- * 5,因为String类型不能改变长度,我们可以在缓冲区操作StringBuilder,使用该类的add方法
- * 对字符串进行拼接
- * 6,最后,再将整数和小数部分连接起来,完成转换
- */
- import java.util.Scanner;
- public class Test10 {
- // 定义单位,数字数组
- private static String[] bigUnit = { "圆", "万", "亿", "万亿" };
- private static String[] smallUnit = { "仟", "佰", "拾" };
- private static String[] capital = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒",
- "捌", "玖" };
- private static String[] decimals = { "角", "分" };
- public static void main(String[] args) {
- // 键盘录入一个数,用double类型的数接收
- Scanner sc = new Scanner(System.in);
- double num = sc.nextDouble();
- // 调用方法,传递接收到的double类型的数
- System.out.println(numToRmb(num));
- }
- // 定义方法,实现阿拉伯数字到中国传统格式的转换
- public static String numToRmb(double num) {
- //String result = null;
- StringBuilder sb = new StringBuilder();
- long zheng = (long) num;
- // 传递一个double类型的数,返回long型的最接近的传递参数的数
- long xiao = Math.round((num - zheng) * 100);
- String xiaoStr = String.valueOf(xiao);
- String zhengStr = String.valueOf(zheng);
- // 给小数部分加单位和转换数字
- String end = xiaoPart(xiaoStr);
- // 给整数部分加单位和转换数字
- int length = zhengStr.length();
- if (zhengStr.length() % 4 == 0) {
- int part = zhengStr.length() / 4;
- for (int i = 0; i < part; i++) {
- sb.insert(0, addUnit(zhengStr, length, i));
- }
- /*result = */endConvent(sb.toString());
- } else {
- // 不能被4整出的话 在最前面用0补位补到可以被4整除
- int part = zhengStr.length() / 4 + 1;
- int buLing = 4 - sb.length() % 4;
- StringBuilder tmpSB = new StringBuilder(zhengStr);
- for (int i = 0; i < buLing; i++) {
- tmpSB.insert(0, "0");
- }
- for (int i = 0; i < part; i++) {
- sb.insert(0, addUnit(tmpSB.toString(), tmpSB.length(), i));
- }
- //result = endConvent(sb.toString());
- }
- return endConvent(sb.toString()) + end;
- }
- // 处理字符串 去掉大单位前面多余的零
- private static String endConvent(String str) {
- str = str.replace("零万亿", "万亿");
- str = str.replace("零亿", "亿");
- str = str.replace("零万", "万");
- str = str.replace("零圆", "圆");
- // 如果不能被4整出 去掉前面补的零
- if (str.charAt(0) == '零') {
- str = str.substring(1, str.length());
- }
- return str;
- }
- // 小数部分转换加单位
- private static String xiaoPart(String xiaoStr) {
- //String xiaoResult = null;
- StringBuilder xiaosb = new StringBuilder();
- for (int i = 0; i < xiaoStr.length(); i++) {
- int k = xiaoStr.charAt(i) - 48;
- xiaosb.append(capital[k] + decimals[i]);
- }
- //xiaoResult = xiaosb.toString();
- return xiaosb+""/*.toString()*/;
- }
- // 整数部分添加单位并转换数字
- private static String addUnit(String numStr, int length, int index) {
- String result = null;
- StringBuilder sb = new StringBuilder();
- String tmp = null;
- //得到每四位后面的大单位
- String endTmp = bigUnit[index];
- //将输入的数每四个分为一组,转换成int类型数字
- tmp = numStr.substring(length - 4 * (index + 1), length - 4 * index);
- for (int i = 0; i < tmp.length(); i++) {
- if (tmp.charAt(i) == '0') {
- // 把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48
- // 因此把char型数字减去48得到int型数字
- int k = tmp.charAt(i) - 48;
- sb.append(capital[k]);
- } else {
- int k = tmp.charAt(i) - 48;
- if (i != tmp.length() - 1) {
- //将小单位加在对应的数字后面存储到缓冲区
- sb.append(capital[k] + smallUnit[i]);
- } else {
- sb.append(capital[k]);
- }
- }
- }
- //去零操作,去掉多余的零,使用String类的替换功能
- result = sb.toString() + endTmp;
- result = result.replace("零零零零万亿", "零");
- result = result.replace("零零零零亿", "零");
- result = result.replace("零零零零万", "零");
- result = result.replace("零零零零", "零");
- result = result.replace("零零零", "零");
- result = result.replace("零零", "零");
- return result;
- }
- }
复制代码 |
|