using System;
using System.Text.RegularExpressions;
using Microsoft.International.Formatters;
using System.Globalization;
namespace TestNumber
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 2000; i++)
{
Console.Write(FormatChineseNumber(i, false) + " ");
}
Console.WriteLine(FormatChineseNumber(
string.Format("中華民國{0}年{1}月{2}日",
DateTime.Today.Year - 1911,
DateTime.Today.Month,
DateTime.Today.Day), false));
Console.WriteLine(FormatChineseNumber(12.345M, false));
Console.WriteLine(FormatChineseNumber(3100000M, true));
Console.WriteLine(FormatChineseNumber(100000M, true));
Console.Read();
}
/// <summary>
/// 將字串的數字部分轉為中文大寫
/// </summary>
/// <param name="s">原始字串</param>
/// <param name="moneyChar">
/// 是否使用金額大寫,true時使用"壹貳參肆...", false時則為"一二三四..."
/// </param>
/// <returns>轉換後字串</returns>
static string FormatChineseNumber(string s, bool moneyChar)
{
return Regex.Replace(s, "\\d+", m =>
{
int n = int.Parse(m.Value);
return FormatChineseNumber(n, moneyChar);
});
}
/// <summary>
/// 修正EastAsiaNumericFormatter.FormatWithCulture出現"三百十"之問題,
/// 本函數會將其修正為三百一十的慣用寫法
/// 2015-04-12更新,增加拾萬改為壹拾萬邏輯
/// </summary>
/// <param name="n">要轉換的數字</param>
/// <param name="moneyChar">
/// 是否使用金額大寫,true時使用"壹貳參肆...", false時則為"一二三四..."
/// </param>
/// <returns>轉為中文大寫的數字</returns>
static string FormatChineseNumber(decimal n, bool moneyChar)
{
//"L"-大寫,壹貳參... "Ln"-一二三... "Lc"-貨幣,同L
string t =
EastAsiaNumericFormatter.FormatWithCulture(
moneyChar ? "L" : "Ln", n,
null, new CultureInfo("zh-TW"));
string pattern = moneyChar ?
"[^壹貳參肆伍陸柒捌玖]拾" :
"[^一二三四五六七八九]十";
string one = moneyChar ? "壹" : "一";
string res = Regex.Replace(t, pattern, m =>
{
return m.Value.Substring(0, 1) + one +
m.Value.Substring(1);
});
//拾萬需補為壹拾萬
if (moneyChar && res.StartsWith("拾"))
{
res = "壹" + res;
}
return res;
}
}
}