之前有寫過有關錢的系統,所以不免俗會跟銀行一樣有阿拉伯數字轉中文大小寫的需求,使用這篇文章分享一下如何使用正規表示式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);
}
}