2014年3月26日 星期三

中文數字轉阿拉伯數字 ( C# 測試版 )

如何將「六十兆零五十二億三千八百六十二萬六千四百二十五」轉為阿拉伯數字,網路上大部分都是將阿拉伯數字轉為中文數字,所以我就自己來寫一個中文數字轉阿拉伯數字。

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

}

迴圈每走完一次,數值的變化:
文字iResultt_l_t_l
006
0060
6000000000000000
6000000000000005
60000000000000050
60000000000000052
6000520000000000
6000520000000003
6000520000000030000
6000520000000030008
6000520000000038000
6000520000000038006
60005200000000380060
60005200000000380062
6000523862000000
6000523862000006
6000523862000060000
6000523862000060004
6000523862000064000
6000523862000064002
60005238620000640020
60005238620000640025

這樣看數值變化比較有感覺。

最後把殘餘值加上,輸出 60005238626425。




沒有留言 :

張貼留言

Related Posts Plugin for WordPress, Blogger...