昨天老大問我又沒有寫過中文數字轉換成阿拉伯數字,我說沒有,我說那應該簡單啊,就是將中文對應的數字換成阿拉伯數字就好了啊,比如一就換成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_先森