黑马程序员技术交流社区

标题: 雷锋同志请进 [打印本页]

作者: 陈召    时间: 2014-12-28 23:37
标题: 雷锋同志请进
/*10、  金额转换,阿拉伯数字转换成中国传统形式。

例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整*/
public class Test10 {
        public static void main(String[] args) {
//                键盘接收数字
                Scanner sc=new Scanner(System.in);
                String str=sc.next();
               
//                change转换方法
                change(str);
        }

//        定义一个转换的方法
        private static void change(String str) {
//                将汉字数字和单位装入数组
                String [] num={"壹","貳","叁","肆","伍","陆","柒","捌","玖"};
                String [] mea={"圆","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万"};
                String str2="";
                for (int i = 0; i < str.length(); i++) {
                       
                        if (Integer.parseInt(str)==0) {//考虑输入0的情况,直接提示无效数字
                                System.out.println("无效数字!");
                        }
                        if(str.startsWith("0")) {//考虑0开头的情况,通过substring得到去掉开头的0,得到新str
                                str=str.substring(1);
                                i--;
                                continue;
                        }
                       
                        if (i==0) {//首位不是0的时候,得到对应的汉字数字+对应的单位  
                                str2 += num[Integer.parseInt(str.charAt(i)+"")-1]+mea[str.length()-i-1];
                                i++;
                        }
                                if (Integer.parseInt(str.charAt(i)+"")==0) {//考虑中间可能有0
                                        str2+="零";
                                        i++;
                                        if (Integer.parseInt(str.charAt(i)+"")==0) {
                                                i++;
                                        }
                        }
                                str2 += num[Integer.parseInt((str.charAt(i))+"")-1]+mea[str.length()-i-1];
                                if (i==str.length()-1) {//最后一位时,加上"整"
                                        str2 +="整";
                                }
                }
                System.out.println(str2);
        }
}


以上是我写的代码,不够完善,比如说输入1002能打印,输入1000就会报错,还有接收的数字过大也会报错。大概知道是哪里的问题,但是不知道该怎么改?哪位大神指点一下?

作者: 赖永树    时间: 2014-12-29 20:58
本帖最后由 赖永树 于 2014-12-29 21:01 编辑

太长就不看你的了

作者: 陈召    时间: 2014-12-30 00:36
赖永树 发表于 2014-12-29 20:58
太长就不看你的了

.....{:3_47:}
作者: Eagle    时间: 2014-12-30 08:26
楼主,我贴一下我的代码吧。比你的长的多了。
可以满分通过的哟。嘿嘿
  1. package com.itheima;

  2. /**
  3. * 10、 金额转换,阿拉伯数字转换成中国传统形式。
  4. * 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
  5. *
  6. * 思路:
  7. *
  8. * 1、把小数点前后分开,分别处理。
  9. *
  10. * 2、将切割后的字符串金额转换为字符数组
  11. *
  12. * 3、将字符转成整数型。
  13. *
  14. * 4、用转换的整数去查表。
  15. *
  16. * 5、每获取一个整数的大写形式,就在后面跟上相应的单位,如拾、佰、仟、万等单位。存储在缓冲区中。
  17. *
  18. * 6、再将零拾等替换成零。去除多余零等操作。
  19. *
  20. * 7、将替换完毕后的字符串返回
  21. *
  22. *
  23. * 大写中零的规则:
  24. *
  25. * 阿拉伯金额数字万位和元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”但千位、角位不是“0”时,
  26. * 中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1680.32应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分。
  27. * 又如¥107000.53应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。
  28. */
  29. public class Test10 {
  30.         public static void main(String[] args) {
  31.        
  32.                 //将要被转换的金额
  33.                 String moneyNum = "101000001010";

  34.                 //转换金额
  35.                 String str = moneyCast(moneyNum);

  36.                 //打印转换后的金额
  37.                 System.out.println("¥"+str);
  38.         }

  39.         // 将阿拉伯金额转成大写的金额,最大转换金额单位:万亿,最小:毫
  40.         public static String moneyCast(String moneyStr) {
  41.                
  42.                 //如果金额为空,返回零圆整
  43.                 if(moneyStr==null || moneyStr.equals(""))
  44.                         throw new RuntimeException("金额为空!");
  45.        
  46.                 // 用的是查表法,这是0-9的大写表格。
  47.                 String[] bigNum = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

  48.                 // 这是相应位数后面的单位
  49.                 String[] unit = { "圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾",
  50.                                 "佰", "仟", "万" };

  51.                 // 确定金额的正负,并将前面的负号去掉
  52.                 String head = "";
  53.                 if (moneyStr.startsWith("-")) {
  54.                         head = "负";
  55.                         moneyStr = moneyStr.replace("-", "");
  56.                 }

  57.                 // 将整数部分和小数部分切割分开进行大写转换
  58.                 String[] temp = moneyStr.split("\\.");
  59.                 // =====================================================
  60. /**
  61. * 整数部分转换
  62. */
  63.                 //将整数部分的0去掉
  64.                 while(temp[0].startsWith("0")) {
  65.                         temp[0] = temp[0].replaceFirst("0", "");
  66.                 }
  67.                
  68.                 // 获取前面整数部分的整数形式的数组
  69.                 int[] startMoney = strToInt(temp[0]);

  70.                 // 当输入的金额超出转换能力时,直接抛出错误提示。不再进行转换
  71.                 if (startMoney.length > unit.length)
  72.                         throw new ArrayIndexOutOfBoundsException("位数超出!");

  73.                 // 定义一个整数,作为查找位数后面的单位的指针
  74.                 int unitLeng = startMoney.length;

  75.                 // 缓冲区用于装查表后的结果。
  76.                 StringBuilder sb = new StringBuilder();
  77.                
  78.                 // 遍历前面整数,查表,添加到缓冲区
  79.                 for (int i = 0; i < startMoney.length; i++) {

  80.                         // 添加大写格式到缓冲区
  81.                         sb.append(bigNum[startMoney[i]]);

  82.                         // 添加单位到缓冲区
  83.                         sb.append(unit[--unitLeng]);
  84.                 }

  85.                 // 将缓冲区的字符串取出
  86.                 String bigMoney = sb.toString();

  87.                 // 对字符串进行去除多余文字的处理。如零佰、零仟、多个零等等。
  88.                 bigMoney = bigMoney.replaceAll("零[拾佰仟]", "零").replaceAll("零+万", "万")
  89.                                                         .replaceAll("零+亿", "亿").replaceAll("亿万", "亿零")
  90.                                                         .replaceAll("零+圆", "圆").replaceAll("零+", "零");

  91.                 //如果整数部分为零,就去掉所有整数部分的字符串
  92.                 if(bigMoney.matches("[万亿]?(万亿)?圆"))
  93.                         bigMoney = "";
  94.                
  95.                
  96. // =========================================================
  97.                
  98.                 // 如果没有小数,并且整数部分为零,直接返回零圆整
  99.                 if (temp.length == 1 && bigMoney.equals(""))
  100.                         return "零圆整";
  101.                 // 如果没有小数,并且整数部分不为零,直接返回整数部分
  102.                 else if(temp.length == 1)
  103.                         return head + bigMoney + "整";
  104. /**
  105. * 小数部分转换
  106. */

  107.                 // 小数部分的单位表格
  108.                 String[] smallUnit = { "角", "分" };//可扩展 "厘", "毫"

  109.                 // 获取小数部分的整数形式的数组
  110.                 int[] endMoney = strToInt(temp[1]);

  111.                 // 判断小数部分的位数是否超出范围
  112.                 if (endMoney.length > smallUnit.length) {
  113.                         throw new ArrayIndexOutOfBoundsException("小数点后面的位数超过了4位!");
  114.                 }

  115.                 // 创建缓冲区,用于存储小数部分的大写形式
  116.                 StringBuilder sbd = new StringBuilder();

  117.                 // 遍历查表将数字与单位添加进缓冲区。
  118.                 for (int x = 0; x < endMoney.length; x++) {

  119.                         // 添加数字的大写格式
  120.                         sbd.append(bigNum[endMoney[x]]);

  121.                         // 添加小数的单位
  122.                         sbd.append(smallUnit[x]);
  123.                 }

  124.                 // 将缓冲区数据转为字符串,方便进行替换操作
  125.                 String smallStr = sbd.toString();

  126.                 // 去掉多余零和其他多余的字符。
  127.                 smallStr = smallStr.replaceAll("零[角分]", "").replaceAll("零+", "零");

  128.                 // 整数部分为零的情况
  129.                 if (bigMoney.equals("")) {
  130.                         //小数部分为零,返回零圆整
  131.                         if(smallStr.equals(""))
  132.                                 return "零圆整";
  133.                         //小数部分不为零,直接返回符号和小数部分
  134.                         else
  135.                                 return head + smallStr;
  136.                        
  137.                 }

  138.                 // 如果小数部分为零,就将整数部分后面加上整字符。
  139.                 if (smallStr.equals(""))
  140.                         bigMoney = bigMoney + "整";

  141.                 // 都不为零就将整数部分加上小数部分
  142.                 else {
  143.                         //将个位为零的情况在圆后面加上零。
  144.                         if(bigMoney.matches(".+[拾佰仟万亿]圆"))
  145.                                 bigMoney = bigMoney + "零";
  146.                         bigMoney = bigMoney + smallStr;
  147.                 }

  148.                 // 返回符号和大写金额。
  149.                 return head + bigMoney;
  150.         }

  151.         // 将字符串转为整数数组
  152.         public static int[] strToInt(String temp) {

  153.                 // 将字符串转为字符数组
  154.                 char[] chs = temp.toCharArray();

  155.                 // 新建int数组用于装金额的单个整数形式
  156.                 int[] arr = new int[chs.length];

  157.                 // 遍历字符数组
  158.                 for (int a = 0; a < chs.length; a++) {

  159.                         // 将字符转为字符串
  160.                         String ch = Character.toString(chs[a]);

  161.                         // 将字符串转为int类型
  162.                         try {

  163.                                 int i = Integer.parseInt(ch);

  164.                                 // 存入int类型的数组
  165.                                 arr[a] = i;

  166.                                 // 处理用户输入错误字符的情况
  167.                         } catch (NumberFormatException e) {

  168.                                 throw new NumberFormatException("输入的金额格式有误!");
  169.                         }
  170.                 }

  171.                 // 将整数形式的数组返回
  172.                 return arr;
  173.         }
  174. }
复制代码

作者: 菜鸟一号    时间: 2014-12-30 09:48
Eagle 发表于 2014-12-30 08:26
楼主,我贴一下我的代码吧。比你的长的多了。
可以满分通过的哟。嘿嘿

好人。。。。。。感谢了
作者: 任我行    时间: 2014-12-30 10:17
我两头像一样诶  赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2