中文数字文字转换成阿拉伯数字
在参考率网络上的部分代码后,写了一个简单的转换方法,原本是想用在抓取电子书中的标题使用的,比如,“第一千三百零二章”转换成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); }
现在可以了,将两个方法复制到同一个文件内,就可以直接使用了,但因为是根据电子书应用写的,所以并不适用于所有情况,不如就没有考虑亿的问题,没有考虑真正的汉字数字比如零点几几的问题,这些是不会出现在电子书的标题中的。