首先要定義一、二、三、....、九的對應,且要定義百、千、億、兆的對應,由於「兆」已經超過 int ( 整數 ) 範圍了,所以在這裡使用 log ( 長整數 ):
Dictionary<string, long> digit =
new Dictionary<string, long>()
{ { "一", 1 },
{ "二", 2 },
{ "三", 3 },
{ "四", 4 },
{ "五", 5 },
{ "六", 6 },
{ "七", 7 },
{ "八", 8 },
{ "九", 9 } };
Dictionary<string, long> word =
new Dictionary<string, long>()
{ { "百", 100 },
{ "千", 1000 },
{ "萬", 10000 },
{ "億", 100000000 },
{ "兆", 1000000000000 } };
Dictionary<string, long> ten =
new Dictionary<string, long>()
{ { "十", 10 } };
為何要這樣宣告?假設說你的一為壹、二為貳、.....、九為玖,就可以多加幾列
{ "壹", 1 },
{ "貳", 2 },
...
{ "玖", 9 },
百、千、億、兆 位數字也可以這樣子做,因為中文數字可以混用,甚至可以使用簡體中文,達到最大使用性。
接下來就是程式部份了,其實規格很簡單,數字由左向右,或加或乘且紀錄,當文字碰到比千還大的文字 ( 萬、億、兆 ),就要將紀錄值
我使用兩個變數儲存 t_l、 _t_l,_t_l 紀錄該次讀取的文字,先將文字除掉所有零字。
若為數字,則紀錄於 _t_l;若為十,則看 _t_l 是否為 0,不為 0,則 _t_l 乘上 10,為 0,則 _t_l 為 10;
若不為數字,則將 _t_l 乘上 文字對應的值;
若碰上比千位數大的文字 ( 萬、億、兆 ),就要將 _t_l 加上 t_l 再乘文字對應的值。
最後再把殘餘值加上,輸出結果。
先看程式碼:
public long GetChineseNumberToInt(string s)
{
long iResult = 0;
s = s.Replace("零", "");
int index = 0;
long t_l = 0, _t_l = 0;
string t_s;
while (s.Length > index)
{
t_s = s.Substring(index++, 1);
// 數字
if (digit.ContainsKey(t_s))
{
_t_l += digit[t_s];
}
// 十
else if (ten.ContainsKey(t_s))
{
_t_l = _t_l == 0 ? 10 : _t_l * 10;
}
// 百、千、億、兆
else if (word.ContainsKey(t_s))
{
// 碰到千位則使 _t_l 與 t_l 相加乘上目前讀到的數字,
// 並將輸出結果累加。
if (word[t_s] > word["千"])
{
iResult += (t_l + _t_l) * word[t_s];
t_l = 0;
_t_l = 0;
continue;
}
_t_l = _t_l * word[t_s];
t_l += _t_l;
_t_l = 0;
}
}
// 將殘餘值累加至輸出結果
iResult += t_l;
iResult += _t_l;
return iResult;
}
迴圈每走完一次,數值的變化:
| 文字 | iResult | t_l | _t_l |
|---|---|---|---|
| 六 | 0 | 0 | 6 |
| 十 | 0 | 0 | 60 |
| 兆 | 60000000000000 | 0 | 0 |
| 五 | 60000000000000 | 0 | 5 |
| 十 | 60000000000000 | 0 | 50 |
| 二 | 60000000000000 | 0 | 52 |
| 億 | 60005200000000 | 0 | 0 |
| 三 | 60005200000000 | 0 | 3 |
| 千 | 60005200000000 | 3000 | 0 |
| 八 | 60005200000000 | 3000 | 8 |
| 百 | 60005200000000 | 3800 | 0 |
| 六 | 60005200000000 | 3800 | 6 |
| 十 | 60005200000000 | 3800 | 60 |
| 二 | 60005200000000 | 3800 | 62 |
| 萬 | 60005238620000 | 0 | 0 |
| 六 | 60005238620000 | 0 | 6 |
| 千 | 60005238620000 | 6000 | 0 |
| 四 | 60005238620000 | 6000 | 4 |
| 百 | 60005238620000 | 6400 | 0 |
| 二 | 60005238620000 | 6400 | 2 |
| 十 | 60005238620000 | 6400 | 20 |
| 五 | 60005238620000 | 6400 | 25 |
這樣看數值變化比較有感覺。
最後把殘餘值加上,輸出 60005238626425。

沒有留言 :
張貼留言