在參考率網絡上的部分代碼后,寫了一個簡單的轉換方法,原本是想用在抓取電子書中的標題使用的,比如,“第一千三百零二章”轉換成1302
1 /// <summary> 2 /// 將中文數字轉換為阿拉伯數字(逐字符分析的方式) 3 /// </summary> 4 /// <param name="wText">要轉換的中文數字字符串,如一千二百三十四</param> 5 /// <returns>成功返回 int 類型數字,遇到不能解析的參數則拋出 ArgumentException 異常</returns> 6 public int DecodeWordToNumberString(string wText) 7 { 8 /// 9 /// 先替換一下可能的錯字 10 /// 11 wText = wText.Replace("把", "百"); 12 wText = wText.Replace("白", "百"); 13 // 14 int result = 0; 15 int p = 0;//用於記錄遍歷到字符的位置和保存到 list<int>的個數 16 string numString = "一二三四五六七八九壹貳參肆伍陸柒捌玖兩倆仨"; 17 int isNumeric = -1; 18 List<int> numList = new List<int>(5); 19 char[] chars = wText.ToCharArray(); 20 // 21 // 逐個字符遍歷 22 // 遇到數字,就保存至 list<int>,遇到“十百千萬”就進行分析,並正確組合之前list<int>的數字 23 try 24 { 25 for (int i = 0; i < chars.Length; i++) 26 { 27 isNumeric = numString.IndexOf(chars[i]); 28 if (isNumeric > -1) 29 { 30 // 如果是數字,list<int> 中添加入一位數字,並將 p 作為指針移動一位 31 numList.Add(wtonDict[chars[i].ToString()]); 32 p++; 33 } 34 else 35 { 36 switch (chars[i].ToString()) 37 { 38 39 case "十": 40 if (i == 0) // i=0說明十在第一個,是 1x 這樣的數字 41 { 42 numList.Add(10); 43 p++; 44 } 45 else // 如果不是,前面的一個數字要乘以10 46 { 47 if (chars[i - 1].ToString() == "零")// 如果十字的前面是零,按默認一十處理,否則,按常規處理 48 { 49 numList.Add(10); 50 p++; 51 } 52 else 53 { 54 numList[p - 1] = numList[p - 1] * 10; 55 } 56 } 57 break; 58 case "百": 59 numList[p - 1] = numList[p - 1] * 100; 60 break; 61 case "千": 62 numList[p - 1] = numList[p - 1] * 1000; 63 break; 64 case "萬": 65 // 萬字比較復雜,說明前面的所有數字都需要擴大 10000 倍 66 for (int k = 0; k < numList.Count; k++) 67 { 68 numList[k] = numList[k] * 10000; 69 } 70 break; 71 case "零": 72 // 零不需要處理 73 break; 74 } 75 } 76 } 77 // 循環處理結束后,將 list<int> 中的所有數字相加就是結果 78 foreach (int k in numList) 79 { 80 result += k; 81 } 82 // 83 return result; 84 } 85 catch (Exception ex) 86 { throw new ArgumentException(); } 87 }
里邊用到了一個 Dictionary<string,int>,是自定義的一個漢字和阿拉伯數字的映射關系
Dictionary<string, int> wtonDict; // 定義一個漢字與數字的映射關系 /// <summary> /// 用字典方式創建文字和數字的映射關系 /// </summary> private void InitializeWordToNumberDictionary() { wtonDict.Add("一", 1); wtonDict.Add("二", 2); wtonDict.Add("三", 3); wtonDict.Add("四", 4); wtonDict.Add("五", 5); wtonDict.Add("六", 6); wtonDict.Add("七", 7); wtonDict.Add("八", 8); wtonDict.Add("九", 9); wtonDict.Add("十", 10); wtonDict.Add("壹", 1); wtonDict.Add("貳", 2); wtonDict.Add("參", 3); wtonDict.Add("肆", 4); wtonDict.Add("伍", 5); wtonDict.Add("陸", 6); wtonDict.Add("柒", 7); wtonDict.Add("捌", 8); wtonDict.Add("玖", 9); wtonDict.Add("拾", 10); wtonDict.Add("兩", 2); wtonDict.Add("倆", 2); wtonDict.Add("仨", 3); }
現在可以了,將兩個方法復制到同一個文件內,就可以直接使用了,但因為是根據電子書應用寫的,所以並不適用於所有情況,不如就沒有考慮億的問題,沒有考慮真正的漢字數字比如零點幾幾的問題,這些是不會出現在電子書的標題中的。