C# 數字轉漢字
心血來潮需要用一發數字轉漢字的算法,但是網上的好多現成算法bug滿滿,只好自己寫了一波,歡迎指導捉蟲,不多說直接上代碼:
public static class Format
{
static string[] Numbers = new string[] { "零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌", "玖", "拾" };
static string[] Units = new string[] { "", "拾", "佰", "千", "萬", "拾", "佰", "千", "億", "拾" };
public static string ParseNumbers(uint n)
{
string result = "";
string s = n.ToString();
int zero = 0;//連續出現的零的個數
int length = s.Length;
for (int i = 0; i < length; i++)
{
int number = s[i] - '0';
int unit = length - i - 1;
//一十X、一十X萬、一十X億,一十X萬億開頭時,省略開頭的一
if ((length + 2) % 4 == 0 && i == 0 && number == 1 && zero == 0)
{
result += Units[unit];
}
//不爲零時直接輸出數字+單位
else if (number != 0)
{
result += Numbers[number] + Units[unit];
zero = 0;
}
//爲零且在最後一位時,如果前面有連續零,去掉前面的零,否則不操作
else if (unit == 0)
{
if (zero > 0) result = result.Substring(0, result.Length - 1);
else if (length == 1) result += Numbers[0];
}
//是億等級時,必然打出億。
//是萬等級時,如果沒有億則必然打出萬,如果有億但整個萬級別不都是零也打出萬
else if (unit == 8 || (unit == 4 && (length <= 8 || zero < 3)))
{
if (zero > 0)
{
result = result.Substring(0, result.Length - 1);
}
zero = 0;//重置zero
result += Units[length - i - 1];
}
//中間普通的零
else
{
if (zero == 0)
{
result += Numbers[0];
}
zero++;
}
}
return result;
}
}
關於測試:
顯然,測試序列使用一些普通的數字沒有意義,顯然這個算法最脆弱的地方就是零和連續的零,所以我已經通過了以下這些測試用例:
100000000-一億
1000000000-十億
1000100000-十億零一十萬
10000010-一千萬零一十
100000001-一億零一
1000000001-十億零一
1000001001-十億零一千零一
1001001001-十億零一百萬一千零一
101010101-一億零一百零一萬零一百零一
1010101010-十億一千零一十萬一千零一十
更多序列等待補充