黑马程序员技术交流社区

标题: java实现中文传统数字与阿拉伯数字的相互转化(回复送币) [打印本页]

作者: as604049322    时间: 2015-3-13 17:54
标题: java实现中文传统数字与阿拉伯数字的相互转化(回复送币)
本人比较懒,未加注释,有什么不懂的,到群里@我,群名片叫会飞的菜鸟。

  1. import java.util.*;
  2. public class ChineseOrNumber
  3. {
  4.     public static void main(String[] args)
  5.     {
  6. //      把八万四千二百三十二点五八转数字 84232.58
  7.         sop(Integer.MAX_VALUE+toChineseNum(Integer.MAX_VALUE+""));
  8.         sop(Long.MAX_VALUE+toChineseNum(Long.MAX_VALUE+""));
  9.         for(long i=10000L;i<900000000000000L;i+=500050005L){
  10.             System.out.print(i+":");
  11.             String temp=toChineseNum(i+"");
  12.             String temp2=toNum(temp);
  13.             sop(temp);
  14.             sop(temp2);
  15.             if(!temp2.equals(i+"")){
  16.                 sop("错误");
  17.                 break;
  18.             }
  19.         }
  20.     }

  21.     public static String toNum(String str){
  22.         HashMap<String,Integer> number=new HashMap<String,Integer>();
  23.         number.put("一",1);
  24.         number.put("二",2);
  25.         number.put("三",3);
  26.         number.put("四",4);
  27.         number.put("五",5);
  28.         number.put("六",6);
  29.         number.put("七",7);
  30.         number.put("八",8);
  31.         number.put("九",9);

  32.         String zhengshu,xiaoshu;
  33.         if(str.indexOf('点')!=-1){
  34.             String[] shu=str.split("点");
  35.             zhengshu=shu[0];
  36.             xiaoshu=shu[1];
  37.         }else{
  38.             zhengshu=str;
  39.             xiaoshu="0";
  40.         }
  41.         zhengshu=toNumPrivate(zhengshu,number);
  42.         while(zhengshu.charAt(0)=='0')
  43.             zhengshu=zhengshu.substring(1,zhengshu.length());

  44.         number.put("零",0);
  45.         if(xiaoshu.equals("0"))
  46.             return zhengshu;
  47.         else
  48.             return zhengshu+"."+toXiaoshu(xiaoshu,number);
  49.     }

  50.     private static String toNumPrivate(String str,HashMap<String,Integer> number){
  51.         String[] sheet={"亿亿","亿","万"};
  52.         int[] numSheet={16,8,4};
  53.         for(int i=0;i<sheet.length;i++){
  54.             if(str.contains(sheet[i])){
  55.                 String[] strArr=str.split(sheet[i]);
  56.                 String right;
  57.                 if(strArr.length==1)
  58.                     right=getRepeatZero(numSheet[i]);
  59.                 else
  60.                     right=toNumPrivate(strArr[1],number);
  61.                 right=getRepeatZero(numSheet[i]-right.length())+right;
  62.                 return toNumPrivate(strArr[0],number)+right;
  63.             }
  64.         }
  65.         return toZhengshu(str,number);
  66.     }

  67.     public static String getRepeatZero(int num){
  68.         StringBuilder sb=new StringBuilder();
  69.         for(int i=0;i<num;i++)
  70.             sb.append("0");
  71.         return sb.toString();
  72.     }

  73.     private static String toXiaoshu(String str,HashMap<String,Integer> number){

  74.         StringBuilder resultStr=new StringBuilder();
  75.         char[] ch=str.toCharArray();
  76.         Integer temp=null;
  77.         //      把八万四千二百三十二点五八转数字 84232.58
  78.         for(char c:ch)
  79.             resultStr.append(number.get(c+""));
  80.         return resultStr.toString();
  81.     }

  82.     private static String toZhengshu(String str,HashMap<String,Integer> number){
  83.         HashMap<String,Integer> wei=new HashMap<String,Integer>();
  84.         /*相应位所占权重*/
  85.         wei.put("千",1000);
  86.         wei.put("百",100);
  87.         wei.put("十",10);
  88.         int radix=0,tempResult=0,result=0;
  89.         String resultStr=null;
  90.         char[] ch=str.toCharArray();
  91.         Integer temp=null;
  92.         //      把八万四千二百三十二点五八转数字 84232.58
  93.         for(char c:ch){
  94.             if((temp=number.get(c+""))!=null){
  95.                 result+=tempResult;
  96.                 tempResult=0;
  97.                 radix=temp.intValue();
  98.             }else if((temp=wei.get(c+""))!=null){
  99.                 tempResult=(tempResult==0)?radix*temp:tempResult*temp;
  100.             }
  101.         }
  102.         result+=(tempResult==0)?radix:tempResult;
  103.         resultStr=result+"";
  104.         return getRepeatZero(4-resultStr.length())+resultStr;
  105.     }

  106.     public static String toChineseNum(String numStr){
  107.         char[] numSheet={'零','一','二','三','四','五','六','七','八','九'};
  108.         String zhengshu,xiaoshu;
  109.         if(numStr.indexOf(".")!=-1){
  110.             String[] shu=numStr.split("\\.");
  111.             zhengshu=shu[0];
  112.             xiaoshu=shu[1];
  113.         }else{
  114.             zhengshu=numStr;
  115.             xiaoshu="0";
  116.         }
  117.         zhengshu=zhengshu.replaceAll("\\D","");
  118.         xiaoshu=xiaoshu.replaceAll("\\D","");
  119.         String result=toChineseNum(zhengshu,numSheet);
  120.         if(result.equals(""))
  121.             return "转换失败,数值过大或者参数有误";
  122.          //最终结果头部去零
  123.         while(result.charAt(0)=='零')
  124.                 result=result.substring(1,result.length());
  125.         if(xiaoshu.equals("0"))
  126.             return result;
  127.         else
  128.             return result+"点"+toChinesexiaoshu(xiaoshu,numSheet);
  129.     }

  130.     private static String toChinesexiaoshu (String num,char[] numSheet){
  131.         StringBuilder result=new StringBuilder();
  132.         for(int i=0;i<num.length();i++)
  133.             result.append(numSheet[Integer.parseInt(num.charAt(i)+"")]);
  134.         return result.toString();
  135.     }

  136.     private static String toChineseNum (String num,char[] numSheet){
  137.         /*-----------对小于一万的数据进行处理,------------*/
  138.         if(num.length()<=4) {
  139.             String result="";
  140.             char[] UnitArr={'千','百','十'};

  141.             num=getRepeatZero(4-num.length())+num;//对不足四位的数前面补零,直到变成4位

  142.             //遍历4位数的4个数字
  143.             for(int i=0;i<=3;i++) {
  144.                 int temp=Integer.parseInt(num.charAt(i)+"");
  145.                 /*
  146.                 分为当前位等于0和不等于0的情况
  147.                 当当前位等于0时,如果是千位就直接赋值零
  148.                 如果不是千位,则判断前面一位是否为零,不是的话就赋值
  149.                 */
  150.                 if(temp!=0){
  151.                     result+=numSheet[temp];
  152.                     if(i!=3) result+=UnitArr[i];
  153.                 }else{//当前位为零
  154.                     if(i==0){
  155.                         result+="零";
  156.                     }else{
  157.                         temp=Integer.parseInt(num.charAt(i-1)+"");
  158.                         if(temp!=0) result+="零";
  159.                     }
  160.                 }
  161.             }
  162.             //清楚尾部的零
  163.             if(result.charAt(result.length()-1)=='零')
  164.                 result=result.substring(0,result.length()-1);
  165.             return result;//可能返回"零*","*",""(*代表头部和尾部不含零的大写数字)
  166.         }

  167.          /*-----------对大于等于一万小于一亿的数据进行处理------------*/
  168.         if(num.length()<=8 && num.length()>4){
  169.             String left=toChineseNum(num.substring(0,num.length()-4),numSheet);
  170.             String right=toChineseNum(num.substring(num.length()-4,num.length()),numSheet);
  171.             return compara(left,right,"万");
  172.         }

  173.         /*-----------对大于等于一亿小于一亿亿的数据进行处理------------*/
  174.         if(num.length()<=16 && num.length()>8){
  175.             String left=toChineseNum(num.substring(0,num.length()-8),numSheet);
  176.             String right=toChineseNum(num.substring(num.length()-8,num.length()),numSheet);
  177.             return compara(left,right,"亿");
  178.         }

  179.         /*-----------2014年国民生产总值也不到一亿亿,再高的就不处理了------------*/
  180.         if(num.length()<=32 && num.length()>16){
  181.             String left=toChineseNum(num.substring(0,num.length()-16),numSheet);
  182.             String right=toChineseNum(num.substring(num.length()-16,num.length()),numSheet);
  183.             return compara(left,right,"亿亿");
  184.         }
  185.         return "";
  186.     }
  187. //可能返回"零*","*",""(*代表头部和尾部不含零的大写数字)
  188.     public static String compara(String left,String right,String connector){
  189.         if(left.equals("")){
  190.             if((!right.equals("") && right.charAt(0)=='零') || right.equals(""))
  191.                 return right;
  192.             else
  193.                 return "零"+right;
  194.         }
  195.         return left+connector+right;
  196.     }

  197.     public static void sop(Object o){
  198.         System.out.println(o);
  199.     }
  200. }
复制代码


作者: tinyvampire    时间: 2015-3-13 17:54
好厉害的样纸,有时间了我也看下!楼主加油,再接再厉!
作者: 王锅盖    时间: 2015-3-13 17:56
haodiao的样子
作者: yj2015    时间: 2015-3-13 19:28
谢谢楼主,分享
作者: Grady    时间: 2015-3-13 22:54
俺以为是在问问题,没想到是在传播 知识,你会奖励吗
作者: 独孤忆    时间: 2015-3-14 09:50
太复杂了,看不明白。
作者: 吴阳    时间: 2015-3-14 21:04
吸取了 楼主,谢谢你的分享
作者: 等风的车    时间: 2015-3-14 21:05
看了半天,高手
作者: Peng苏    时间: 2015-3-15 00:58
一个也没看懂
作者: qsmaxmin    时间: 2015-3-15 22:59
高手,受教了。。。
作者: Peng苏    时间: 2015-3-16 22:30
班上有同学考试做到
作者: yuwangluo    时间: 2015-3-16 22:56
很不错,感觉用数组的话应该能减少代码量
作者: duzhi409    时间: 2015-4-2 20:18
菜鸟表示好深奥啊
作者: 想不到了解    时间: 2015-4-5 16:54
好长,菜鸟看不懂哈
作者: major2015    时间: 2015-4-6 20:00
谢谢楼主发h币了,不知来晚了没:dizzy:
作者: 蓝蓝的天    时间: 2015-4-14 16:35
哈哈,菜鸟表示看不懂,不知道来晚了吗~~哈哈
作者: gunther    时间: 2015-4-20 21:49
太猛了 ,忽然想起以前有位大神用c编的三国杀了




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