#region 数字转汉字
public string NumToChina(string num)
{
if (num.IndexOf(".") == -1)//只有整数部分
{
if (num.Length > 12)
return "";
else
return Part_Int(num);
}
else
{
if (num.Length > 14)
return "";
else
return Part_Int(num.Split('.')[0]) + Part_Decimal(num.Split('.')[1]);
}
}
public string Part_Int(string A)//整数部分处理
{
if (string.IsNullOrEmpty(A))
return "";
string[] Units = new string[] { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟" };//12个量词
string A_rev = String.Join("",A.Reverse());
string tmp= "";
for (int i = A.Length - 1; i >= 0; i--)
{
tmp += DitoCn(A_rev[i], i) + Units[i];//数字转汉字,并加上量词
}
return tmp.Replace("零仟", "零").Replace("零佰", "零").Replace("零拾", "零").Replace("零零零#万", "零").Replace("零零零", "零").Replace("零零", "零").Replace("零#", "").Replace("#", "");
}
public string Part_Decimal(string B)//小数部分处理
{
if (string.IsNullOrEmpty(B))
return "";
B = B.TrimEnd('0');
int lens = B.Length;
if (lens == 0 || lens > 2)
return "";
string tmp = "点";
for (int i = 0; i < lens; i++)
tmp += DitoCn(B[i]);
return tmp;
}
public string DitoCn(char cha, int index = -1)//数字转汉字
{
string tmp = "";
switch (cha)
{
case '0':
if (index == 0 || index == 4 || index == 8)
tmp = "#";
else
tmp = "零";
break;
case '1':
tmp = "壹";
break;
case '2':
tmp = "贰";
break;
case '3':
tmp = "叁";
break;
case '4':
tmp = "肆";
break;
case '5':
tmp = "伍";
break;
case '6':
tmp = "陆";
break;
case '7':
tmp = "柒";
break;
case '8':
tmp = "捌";
break;
case '9':
tmp = "玖";
break;
default:
tmp = cha.ToString();
break;
}
return tmp;
}
#endregion
效果如下:
10300234.56 转为:壹仟零叁拾万零贰佰叁拾肆点伍陆
100000001 转为:壹亿零壹
关键解析:
1、每级的“个”位(即0、4、8位),如果为0,都转为#,其他位正常数字转大写,最后使用Replace("#","")将其变为空,解决数末尾有0都不读要求。
2、每级连续有几个0,都只转1个零。
如:全是0情况,100001234,使用Replace("零零零#万", "零");10000,使用Replace("零零零", "零").Replace("零零", "零").Replace("零#", "")
3个0情况,100051234、 10001,使用Replace("零零零", "零")
2个0情况,100561234,使用Replace("零零", "零");1001200,使用Replace("零#", "")