using System;
using System.Text.RegularExpressions;
using Microsoft.International.Formatters;
using System.Globalization;
namespace TestChtNumber
{ 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.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出現"三百十"之問題,
/// 本函數會將其修正為三百一十的慣用寫法
/// </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 ? "壹" : "一";
return Regex.Replace(t, pattern, m =>
{ return m.Value.Substring(0, 1) + one +
m.Value.Substring(1);
});
}
}
}