阿拉伯數字轉中文大小寫 , 使用InternationalNumericFormatter和正規表示式Regular Expressions

之前有寫過有關錢的系統,所以不免俗會跟銀行一樣有阿拉伯數字轉中文大小寫的需求,使用這篇文章分享一下如何使用正規表示式Regular Expressions來檢查輸入的金額,並使用EastAsiaNumericFormatter轉換成中文大小寫。

之前有寫過有關錢的系統,所以不免俗會跟銀行一樣有阿拉伯數字轉中文大小寫的需求,使用這篇文章分享一下如何使用正規表示式Regular Expressions來檢查輸入的金額,並使用EastAsiaNumericFormatter轉換成中文大小寫。

首先正規表示式在微軟的API中就可以直接拿來使用,不需要再額外下載第三方套件或API

using System.Text.RegularExpressions;

這個案例中我要判斷的是輸入的金額的格式,由於輸入的金額是可以接受負數金額,且還有包含人民幣的部分,CN還是有在使用小數位的金額的(例如0.5元),另外有的金額輸入會在千位的前方加上逗號(例如45,150),所以在正規表示式的表示就必須包含這幾個規則。

PS.我在前面就把逗號先用Replace處理掉了會單純一點,但其實可以納入正規表示式的規則裡面。

            sInputValue = sInputValue.Replace(",", ""); //Edit by Second 2016.06.27 有的金額欄位會有 4,110 這種方式顯示
            string sResult = string.Empty;
            string sRegexNum = @"^[-+]?\d+(\.\d+)?$";  //判斷是否為數字的正規表示式
            string sRegexInt = @"^-?\d+$";  //判斷是否為整數的正規表示式

要使用EastAsiaNumericFormatter轉換成金額必須先下載安裝微軟.NET推出相關的套件 http://www.microsoft.com/zh-tw/download/details.aspx?id=18970

安裝完畢後把InternationalNumericFormatter.dll加入到專案裡面。

呼叫時,取決於你要取得大寫或是小寫亦或者是貨幣名稱傳入不同的參數(L、Ln、Lc、Lt),但我使用的這版本的API有一個Bug,轉換後的中文大小寫如果百位或十位前面是一的話會不顯示,所以要自行另外補上。

並在最後如果該數字是整數還要加上多少元整。

//標準格式(L):又稱大寫
                //普通格式(Ln):又稱小寫
                //貨幣格式(Lc):用來表示貨幣
                //字譯格式(Lt):以數字符號字元表現數值資料,只支援日文
                //解決EastAsiaNumericFormatter 轉換後的數字 如果是金額會有顯示的異常
                //轉換後4110 = 四千一百十  ==> 十之前需要多補一個一
                string sInput =
                    EastAsiaNumericFormatter.FormatWithCulture(
                    moneyChar ? "L" : "Ln", dInput,
                    null, new CultureInfo("zh-TW"));
                string pattern = moneyChar ?
                        "[^壹貳參肆伍陸柒捌玖]拾" :
                        "[^一二三四五六七八九]十";
                string one = moneyChar ? "壹" : "一";
                string res = Regex.Replace(sInput, pattern, m =>
                {
                    return m.Value.Substring(0, 1) + one +
                        m.Value.Substring(1);
                });


                if(moneyChar){
                    if (bInt == true ) //只有整數的部分
                    {
                        sResult = res + "元整";
                    }
                    else { //含有小數金額的部分 須轉換成角和分
                        sResult = CovertDecPart(res);
                    }
                }