遇到要将汉字数字转换为阿拉伯数字的要求,于是网上查了一下,发现都是把阿拉伯数字转换为汉字的方法,没有我需要的,没办法只好自己写了,研究了一番算法之后,终于把这个函数给整出来了,原理也很简单:循环传入字符串的每一位,判断是单位还是数字,如果是单位就先存起来,如果是数字就和之前的单位相乘然后存到结果里,循环一遍结果就出来了,还不明白的可以看代码注释.
/// <summary>
/// 转换数字
/// </summary>
protected static long CharToNumber(char c)
{
switch (c)
{
case '一': return 1;
case '二': return 2;
case '三': return 3;
case '四': return 4;
case '五': return 5;
case '六': return 6;
case '七': return 7;
case '八': return 8;
case '九': return 9;
case '零': return 0;
default: return -1;
}
}
/// <summary>
/// 转换单位
/// </summary>
protected static long CharToUnit(char c)
{
switch (c)
{
case '十': return 10;
case '百': return 100;
case '千': return 1000;
case '万': return 10000;
case '亿': return 100000000;
default: return 1;
}
}
/// <summary>
/// 将中文数字转换阿拉伯数字
/// </summary>
/// <param name="cnum">汉字数字</param>
/// <returns>长整型阿拉伯数字</returns>
public static long ParseCnToInt(string cnum)
{
cnum = Regex.Replace(cnum, "\\s+", "");
long firstUnit = 1;//一级单位
long secondUnit = 1;//二级单位
long tmpUnit = 1;//临时单位变量
long result = 0;//结果
for (int i = cnum.Length - 1; i > -1; --i)//从低到高位依次处理
{
tmpUnit = CharToUnit(cnum[i]);//取出此位对应的单位
if (tmpUnit > firstUnit)//判断此位是数字还是单位
{
firstUnit = tmpUnit;//是的话就赋值,以备下次循环使用
secondUnit = 1;
if (i==0)//处理如果是"十","十一"这样的开头的
{
result += firstUnit * secondUnit;
}
continue;//结束本次循环
}
else if (tmpUnit > secondUnit)
{
secondUnit = tmpUnit;
continue;
}
result += firstUnit * secondUnit * CharToNumber(cnum[i]);//如果是数字,则和单位想乘然后存到结果里
}
return result;
}
执行ParseCnToInt("一千二百三十五")结果为1235