- public class Test10
- {
-
- /**第10题:金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
- *
- * 分析: 1010 0000 1010
- * 壹仟零壹拾 亿 零 壹仟零壹拾 圆整
- * 1010 0101 1010
- * 壹仟零壹拾 亿 零壹佰零壹 万 壹仟零壹拾 圆整
- * 1111 1111 1111
- * 壹仟壹佰壹拾壹 亿 壹仟壹佰壹拾壹 万 壹仟壹佰壹拾壹 圆整
- *
- *
- * 结论:通过分析找出一个规律:将一串数字从低位开始以4个数字为一组进行分组,
- * 每一组数字的位数是固定的第1位是个位,第2位是十位,第3位是百位,第4位是千位
- * 每一组的结尾处都有一个计数单位,比如 ****亿****万****圆
- *
- * 假如数字的位置是i,我们可以通过i%4来获得该数字是个位还是百位、千位、万位
- * 如果i%4==0,那么在该数字后就要加上计数单位,再用i/4确定是加哪个计数单位
- * i/4==0--------圆
- * i/4==1--------万
- * i/4==2--------亿
- *
- * 将这一串数字转换为字符串后比较容易对每个数字处理。
- * 如何获得大写的数字?
- * 通过String类的charAt()方法获取字符,然后那该字符减去48('0'的ASCII码是48),
- * 再通过查表法获得该数字的大写
- *
- * 思路:
- * 1.将要转换的数字先转换为字符串,然后在将字符串反转(反转后数字的最高位在字符串的尾端,先从尾端开始判断)
- *
- * 2.定义一个StringBuilder类的对象cn,用于存放转换后的结果。
- *
- * 3.定义一个boolean类型的标识符flag,用于记录是否出现连续多个0
- *
- * 4.从尾端开始遍历字符串,取出第i位字符ch,判断ch-48是否等于0:
- * 如果等于0,如果flag为true,将'零'存进cn;flag为false则继续判断下一位
- * 如果不等于O,将数字的大写及位数存进cn,并将flag置为true。
- *
- * 5.判断每一位之后要判断一下i%4是否等于0,如果等于0,就要存入相应的计数单位(圆、万、亿)
- * 在存入计数单位之前,应判断cn的最后一位是不是'零',是'零'就要删去,避免出现"零圆"、"零万"、"零亿"
- *
- * 6.特殊情况:如果万位至千万位之间都是0 则会出现****亿万****圆的情况,需要特殊处理,将'万'替换为'零'
- *
- * @param args
- */
- public static void main(String[] args)
- {
- show(101000001010L);
- show(103000000000L);
- show(104000500000L);
- show(106000700008L);
- show(123456789876l);
- show(9400015l);
- show(1023l);
- }
- public static void show(long money)
- {
- System.out.println(money + ":" + transToChinese(money));
- }
-
- //阿拉伯数字转换成中国传统形式
- public static String transToChinese(long money)
- {
- //如果money等于0,直接返回零,如果大于一万亿,则抛异常
- if(money == 0)
- return "零";
- if(money >= 1000000000000L)
- throw new RuntimeException("钱太多处理不了");
-
- //将数字转换为字符串,再将字符串转换为字符数组进行反转
- // String str = new Long(money).toString();
- String str = String.valueOf(money);
-
- char[] tempch = str.toCharArray();
- for(int x = 0, y = tempch.length - 1; x < y; x++,y--)
- {
- char temp = ' ';
- temp = tempch[x];
- tempch[x] = tempch[y];
- tempch[y] = temp;
- }
- str = new String(tempch);
-
- //用于查表法的数组
- char[] capital = new char[]{'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
- String[] place = new String[]{ "", "拾", "佰", "仟"};
- String[] unit = new String[]{"圆整", "万", "亿"};
-
- //cn用于存放转换为中文的结果,flag用于标识是否出现连续多个0
- StringBuilder cn = new StringBuilder();
- boolean flag = true;
-
- //从尾端开始遍历字符串
- for(int i = str.length() - 1; i >=0; i--)
- {
- int ch = str.charAt(i);
-
- //判断字符是否是'0'
- if(ch-48 ==0)
- {
- //第一次出现零,存入cn,将flag置为false
- if(flag)
- {
- cn.append(capital[0]);
- flag = false;
- }
- else
- {
- //连续多个零,后面的零就不在存入,继续判断下一个字符
- //在继续之前判断是否需要存入计数单位,并先判断计数单位前是不是有'零',并将flag置为true
- if(i%4 ==0)
- {
- if(cn.charAt(cn.length()-1) == '零')
- cn.deleteCharAt(cn.length()-1);
- cn.append(unit[i/4]);
- flag = true;
- }
- continue;
- }
-
- }
- else //字符不是'0'就存入cn,并存入其位数(个位、十位、百位、千位),并将flag置为true
- {
- cn.append(capital[ch - 48]);
- cn.append(place[i%4]);
- flag = true;
- }
-
- //每次循环都判断是否需要存入计数单位,并先判断计数单位前是不是有'零',并将flag置为true
- if(i%4 ==0)
- {
- if(cn.charAt(cn.length()-1) == '零')
- cn.deleteCharAt(cn.length()-1);
- cn.append(unit[i/4]);
- flag = true;
- }
- }
-
- //特殊情况:出现****亿万****圆的情况,将'万'替换为'零'
- // 此举可能导致出现"零零"或者"零圆",将多余的'零'删去
- int index = 0;
- if((index = cn.indexOf("亿万")) != -1)
- cn.replace(index+1,index+2,"零");
- if((index = cn.indexOf("零零")) != -1)
- cn.deleteCharAt(index);
- if((index = cn.indexOf("零圆")) != -1)
- cn.deleteCharAt(index);
-
- return cn.toString();
- }
- }
复制代码 |