中文数字转换成阿拉伯数字(一千二百三十四万五千六百七十八-->12345678)

昨天老大问我又没有写过中文数字转换成阿拉伯数字,我说没有,我说那应该简单啊,就是将中文对应的数字换成阿拉伯数字就好了啊,比如一就换成1,二就换成2…十换成10。可是那么问题来了…… 
一十二呢…不能是1102吧…这不就坑爹了吗?一百万呢………所有我苦苦思索,花费了我差不多半天的时间,终于写出了下面的程序。

 1 public static void main(String[] args){
 2 
 3         Map<Character, String> numberMap = new HashMap<Character, String>();
 4         numberMap.put('零', "0");
 5         numberMap.put('一', "1");
 6         numberMap.put('二', "2");
 7         numberMap.put('三', "3");
 8         numberMap.put('四', "4");
 9         numberMap.put('五', "5");
10         numberMap.put('六', "6");
11         numberMap.put('七', "7");
12         numberMap.put('八', "8");
13         numberMap.put('九', "9");
14         Map<Character, String> numberBit = new HashMap<Character, String>();
15         numberBit.put('十', "10");
16         numberBit.put('百', "100");
17         numberBit.put('千', "1000");
18         numberBit.put('万', "10000");
19         /**
20          * 思路:循环遍历数字字符数组
21          *       举例:
22          *       九                                    把numberMap的key为九取出, 即9
23          *       九十                               把numberMap的key为九取出并乘以numberBit的key为十的值,即9*10=90
24          *       九十一                          把numberMap的key为九取出并乘以numberBit的key为十的值,然后加上numberMap的key为一 的值,即9*10+1=91
25          *       十一                               同上10+1=11
26          *       一百万                          先取出numberMap为一的key的值,然后乘以numberBit的key为百的值,然后乘以numberBit的key为万的值,即1*100*10000=1000000
27          *       一百八十八万           1*100+(8*10+8)*10000=100+88*10000=1880000 
28          *                       
29          */
30         long number = 0;//1008571
31         String chinaNumberStr = "一千二百三十四万五千六百七十八";//12   叁佰贰十 320 三佰二十
32         char[] arrNumber = chinaNumberStr.toCharArray();
33         for (int i = 0; i < arrNumber.length; i++) {
34             char num = arrNumber[i];
35             if (i + 1 < arrNumber.length && numberBit.containsKey(arrNumber[i + 1])) {// 判断后面的汉字是否是位数(十百千万)
36                 if (numberMap.containsKey(num)) {// 如果当前的汉字不是位数
37 
38                     if(i + 3 < arrNumber.length&&arrNumber[i + 1]=='十'&&numberMap.containsKey(arrNumber[i + 2])){
39                         number = number + Integer.parseInt(numberMap.get(num))* Integer.parseInt(numberBit.get(arrNumber[i + 1]));
40                         number = number + Integer.parseInt(numberMap.get(arrNumber[i + 2]));
41                         number = number * Integer.parseInt(numberBit.get(arrNumber[i + 3]));
42                         i=i+2;
43                     }else{// 取出当前对应的数字*位数对应倍数累加在number上
44                         number = number + Integer.parseInt(numberMap.get(num))* Integer.parseInt(numberBit.get(arrNumber[i + 1]));
45                     }
46                 } else if (numberBit.containsKey(num)) {// 如果当前的汉字是位数,即当前的汉字和后一个汉字都是位数(比如百万)
47                                                           //则用number直接*后一个位数
48                     number = number * Integer.parseInt(numberBit.get(arrNumber[i + 1]));
49                 }
50             } else if (numberMap.containsKey(num)) {
51                 number = number + Integer.parseInt(numberMap.get(num));
52             } else if (num == '十' && i == 0) {//“十”特殊处理 当出现十八之类的 十在前面的情况
53                 number = Integer.parseInt(numberBit.get('十'));
54             }
55         }
56         System.out.println(number);
57     }

其实这个老大只是问我有没有写过类似的程序,并没有让我写它,但是我就是喜欢挑战。唉,主要是想看看我自己有没有这个能力写出这个程序来,我也是给朋友测了测,发现了一些BUG,改了不少,后面还是写出来了。不过还是有点不尽人意的地方,比如:”一千一”转换之后变成1001,这里应该是1100的,所有要想是1100必须是”一千一百”后面得加个百字。这就是这里的不足了。 
晕 
我刚刚加了一个numberBit.put(‘亿’, “100000000”); 想转下一亿试一试,结果不行,可能我还要继续改进下。这里暂时只能转换千万及千万以下的数字,不过对于一般的转换也足够了,如果转”壹仟壹佰”这种数字的直接改上面的map里面的key就行了。

我的这个算法有点过于复杂,每个程序的思路第一次都会比较复杂,后面多想几次会想出更加简便的算法,所以你们想出了更好的算法欢迎评论。我去改进我的代码了,之后我会把我改进的代码贴上来的。

                                 Alvin_先森

posted on 2015-04-09 19:29  Alvin_先森  阅读(6866)  评论(0编辑  收藏  举报

导航