首先要定義一、二、三、....、九的對應,且要定義百、千、億、兆的對應,由於「兆」已經超過 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。
沒有留言 :
張貼留言