中文數字轉換成阿拉伯數字(一千二百三十四萬五千六百七十八-->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_先森


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM