遇到要將漢字數字轉換爲阿拉伯數字的要求,於是網上查了一下,發現都是把阿拉伯數字轉換爲漢字的方法,沒有我需要的,沒辦法只好自己寫了,研究了一番算法之後,終於把這個函數給整出來了,原理也很簡單:循環傳入字符串的每一位,判斷是單位還是數字,如果是單位就先存起來,如果是數字就和之前的單位相乘然後存到結果裏,循環一遍結果就出來了,還不明白的可以看代碼註釋.
/// <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