A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1黑马币
本人比较懒,未加注释,有什么不懂的,到群里@我,群名片叫会飞的菜鸟。

  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. }
复制代码

最佳答案

查看完整内容

好厉害的样纸,有时间了我也看下!楼主加油,再接再厉!

16 个回复

倒序浏览
好厉害的样纸,有时间了我也看下!楼主加油,再接再厉!
回复 使用道具 举报
haodiao的样子

评分

参与人数 1黑马币 +1 收起 理由
as604049322 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
谢谢楼主,分享

评分

参与人数 1黑马币 +1 收起 理由
as604049322 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
俺以为是在问问题,没想到是在传播 知识,你会奖励吗

评分

参与人数 1黑马币 +1 收起 理由
as604049322 + 1 淡定

查看全部评分

回复 使用道具 举报
独孤忆 来自手机 中级黑马 2015-3-14 09:50:53
地板
太复杂了,看不明白。
回复 使用道具 举报
吴阳 中级黑马 2015-3-14 21:04:23
7#
吸取了 楼主,谢谢你的分享
回复 使用道具 举报
看了半天,高手
回复 使用道具 举报
一个也没看懂
回复 使用道具 举报
高手,受教了。。。
回复 使用道具 举报
班上有同学考试做到
回复 使用道具 举报
很不错,感觉用数组的话应该能减少代码量
回复 使用道具 举报
菜鸟表示好深奥啊
回复 使用道具 举报
好长,菜鸟看不懂哈
回复 使用道具 举报
谢谢楼主发h币了,不知来晚了没:dizzy:
回复 使用道具 举报
哈哈,菜鸟表示看不懂,不知道来晚了吗~~哈哈
回复 使用道具 举报
太猛了 ,忽然想起以前有位大神用c编的三国杀了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马