中文数字文字转换成阿拉伯数字

在参考率网络上的部分代码后,写了一个简单的转换方法,原本是想用在抓取电子书中的标题使用的,比如,“第一千三百零二章”转换成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);
        }

现在可以了,将两个方法复制到同一个文件内,就可以直接使用了,但因为是根据电子书应用写的,所以并不适用于所有情况,不如就没有考虑亿的问题,没有考虑真正的汉字数字比如零点几几的问题,这些是不会出现在电子书的标题中的。

posted @ 2013-06-16 20:29  试试手气  阅读(5576)  评论(2编辑  收藏  举报