- 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();
 
 -         }
 
 - }
 
  复制代码 |