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-十亿一千零一十万一千零一十
更多序列等待补充