黑马程序员技术交流社区

标题: 递归解决金额转换问题(入学测试题)还可转换成大写数字 [打印本页]

作者: as604049322    时间: 2014-12-18 16:54
标题: 递归解决金额转换问题(入学测试题)还可转换成大写数字
本帖最后由 as604049322 于 2014-12-27 22:02 编辑

望大牛能够优化一下!
思路:将一个数字字符串分解成4位数,然后将这些分解并处理好的结果用万、亿连接起来。
  1. //金额转换,阿拉伯数字转换成中国传统形式。例如:101000001010 转换为壹仟零壹拾亿零壹仟零壹拾 圆整

  2. class  GetChineseNum
  3. {
  4.     public static void main(String[] args) {
  5.         sop(getMoneyNum("333600000"));
  6.         sop(getUppercaseNum("333600000"));
  7.     }
  8.     public static void sop(Object o) {
  9.         System.out.println(o);
  10.     }

  11.     public static String getMoneyNum(String numStr){
  12.         if(numStr.equals("0"))
  13.             return "零 圆整";
  14.         String result=getChineseNum(numStr,true);
  15.         if(result.equals(""))
  16.             return "转换失败,数值过大或者参数有误";
  17.         //头部去零
  18.         while(result.charAt(0)=='零')
  19.                 result=result.substring(1,result.length());
  20.         return result+" 圆整";
  21.     }

  22.     public static String getUppercaseNum(String numStr){
  23.         String result=getChineseNum(numStr,false);
  24.          //头部去零
  25.         while(result.charAt(0)=='零')
  26.                 result=result.substring(1,result.length());
  27.         return result;
  28.     }

  29.     private static String getChineseNum (String num, boolean money){
  30.         /*-----------对小于一万的数据进行处理,------------*/
  31.         if(num.length()<=4) {
  32.             String result="";
  33.             char[] numSheet={'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
  34.             char[] numSheet2={'零','一','二','三','四','五','六','七','八','九'};
  35.             char[] UnitArr={'仟','佰','拾'};
  36.             char[] UnitArr2={'千','百','十'};
  37.             while(num.length()!=4){//对不足四位的数前面补零,直到变成4位
  38.                 num="0"+num;
  39.             }
  40.             //遍历4位数的4个数字
  41.             for(int i=0;i<=3;i++) {
  42.                 int temp=new Integer(num.charAt(i)+"");
  43.                 /*
  44.                 分为当前位等于0和不等于0的情况
  45.                 当当前位等于0时,如果是千位就直接赋值零
  46.                 如果不是千位,则判断前面一位是否为零,不是的话就赋值
  47.                 */
  48.                 if(temp!=0){
  49.                     result+=(money?numSheet[temp]:numSheet2[temp]);
  50.                     if(i!=3) result+=(money?UnitArr[i]:UnitArr2[i]);
  51.                 }else{//当前位为零
  52.                     if(i==0){
  53.                         result+="零";
  54.                     }else{
  55.                         temp=new Integer(num.charAt(i-1)+"");
  56.                         if(temp!=0) result+="零";
  57.                     }
  58.                 }
  59.             }
  60.             //清楚尾部的零
  61.             if(result.charAt(result.length()-1)=='零')
  62.                 result=result.substring(0,result.length()-1);
  63.             return result;
  64.         }

  65.          /*-----------对大于等于一万小于一亿的数据进行处理------------*/
  66.         if(num.length()<=8 && num.length()>4){
  67.             String left=getChineseNum(num.substring(0,num.length()-4),money);
  68.             String right=getChineseNum(num.substring(num.length()-4,num.length()),money);
  69.             if(left.equals("")){
  70.                 if(!right.equals("") && right.charAt(0)=='零')
  71.                     return right;
  72.                 else
  73.                     return "零"+right;
  74.             }
  75.             return left+(money?"萬":"万")+right;
  76.         }

  77.         /*-----------对大于等于一亿小于一亿亿的数据进行处理------------*/
  78.         if(num.length()<=16 && num.length()>8){
  79.             String left=getChineseNum(num.substring(0,num.length()-8),money);
  80.             String right=getChineseNum(num.substring(num.length()-8,num.length()),money);
  81.             if(left.equals("零"))
  82.                 return right;
  83.             return left+"亿"+right;
  84.         }

  85.         /*-----------2014年国民生产总值也不到一亿亿,再高的就不处理了------------*/
  86.         if(num.length()<=32 && num.length()>16){
  87.             String left=getChineseNum(num.substring(0,num.length()-16),money);
  88.             String right=getChineseNum(num.substring(num.length()-16,num.length()),money);
  89.             if(left.equals("零"))
  90.                 return right;
  91.             return left+"亿亿"+right;
  92.         }
  93.         return "";
  94.     }
  95. }
复制代码

作者: as604049322    时间: 2014-12-18 16:59
本帖最后由 as604049322 于 2014-12-28 09:56 编辑

sop(getMoneyNum("5640"));
        sop(getUppercaseNum("5640"));
        sop(getMoneyNum("658200"));
        sop(getUppercaseNum("658200"));
        sop(getMoneyNum("333600000"));
        sop(getUppercaseNum("333600000"));
        sop(getMoneyNum("101000001010"));
        sop(getUppercaseNum("101000001010"));
运行结果:
伍仟陆佰肆拾 圆整
五千六百四十
陆拾伍萬捌仟贰佰 圆整
六十五万八千二百
叁亿叁仟叁佰陆拾萬 圆整
三亿三千三百六十万
壹仟零壹拾亿零壹仟零壹拾 圆整
一千零一十亿零一千零一十
作者: as604049322    时间: 2014-12-18 18:41
自己顶,,有人回复为止
作者: 小精灵    时间: 2014-12-18 19:47
没有注释,看着好费劲的说
作者: quick3g    时间: 2014-12-27 00:25
还有bug,System.out.println(getMoneyNum("101000001010"));//壹仟零壹拾亿万壹仟零壹拾圆整
作者: 小小志    时间: 2014-12-27 09:53
关键是去零 ,而不是数值的大小 ,况且比亿大的是兆 ,千亿位过了是兆位,比亿级更大的数级是兆级。亿:代表的是10的八次方。 兆:代表的是10的十二次方。 京:代表的是10的十六次方。等等
作者: as604049322    时间: 2014-12-27 11:18
本帖最后由 as604049322 于 2014-12-28 08:28 编辑
quick3g 发表于 2014-12-27 00:25
还有bug,System.out.println(getMoneyNum("101000001010"));//壹仟零壹拾亿万壹仟零壹拾圆整 ...

感谢您的查阅,您说的BUG已经修护,如果还有BUG请联系我。
您可以查看一楼的代码,已经消除我能够想到的BUG,而加入了转换成大写数字的功能


作者: 找寻小龙猫    时间: 2014-12-28 02:18
你好活跃……
作者: as604049322    时间: 2014-12-28 08:30
找寻小龙猫 发表于 2014-12-28 02:18
你好活跃……

额。。我可能是有强迫症。
作者: yedaiwang    时间: 2014-12-28 09:46
看不懂  是什么意思
作者: as604049322    时间: 2014-12-28 09:58
小精灵 发表于 2014-12-18 19:47
没有注释,看着好费劲的说

我现在加了注释,而且进行了一定的优化,你现在看的还费劲吗?




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