本文已参与「新人创作礼」活动,一起开启掘金创作之路
最近 有一个需求 就是 如何把阿拉伯数字给转成中文数字 想来想出 终于想出来了
代码如下:
public static string NumToChinese(string x)
{
string[] pArrayNum = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
//为数字位数建立一个位数组
string[] pArrayDigit = { "", "十", "百", "千" };
//为数字单位建立一个单位数组
string[] pArrayUnits = { "", "万", "亿", "万亿" };
var pStrReturnValue = ""; //返回值
var finger = 0; //字符位置指针
var pIntM = x.Length % 4; //取模
int pIntK;
if (pIntM > 0)
pIntK = x.Length / 4 + 1;
else
pIntK = x.Length / 4;
//外层循环,四位一组,每组最后加上单位: ",万亿,",",亿,",",万,"
for (var i = pIntK; i > 0; i--)
{
var pIntL = 4;
if (i == pIntK && pIntM != 0)
pIntL = pIntM;
//得到一组四位数
var four = x.Substring(finger, pIntL);
var P_int_l = four.Length;
//内层循环在该组中的每一位数上循环
for (int j = 0; j < P_int_l; j++)
{
//处理组中的每一位数加上所在的位
int n = Convert.ToInt32(four.Substring(j, 1));
if (n == 0)
{
if (j < P_int_l - 1 && Convert.ToInt32(four.Substring(j + 1, 1)) > 0 && !pStrReturnValue.EndsWith(pArrayNum[n]))
pStrReturnValue += pArrayNum[n];
}
else
{
if (!(n == 1 && (pStrReturnValue.EndsWith(pArrayNum[0]) | pStrReturnValue.Length == 0) && j == P_int_l - 2))
pStrReturnValue += pArrayNum[n];
pStrReturnValue += pArrayDigit[P_int_l - j - 1];
}
}
finger += pIntL;
//每组最后加上一个单位:",万,",",亿," 等
if (i < pIntK) //如果不是最高位的一组
{
if (Convert.ToInt32(four) != 0)
//如果所有4位不全是0则加上单位",万,",",亿,"等
pStrReturnValue += pArrayUnits[i - 1];
}
else
{
//处理最高位的一组,最后必须加上单位
pStrReturnValue += pArrayUnits[i - 1];
}
}
return pStrReturnValue;
}
首先 我们先为数字位数建立一个位数组
然后再为为数字单位建立一个单位数组
然后设置一个字符位置指针和取模
我简单解释一下这里的思路:
就是先判断阿拉伯数字有多少位 每四位作为一组 通过字符串截断 一组一组先通过外循环处理每四位最后的单位
然后通过内循环把字符串转换为数字 通过数字获取到中文的位数
最后就得出了中文的数字
其中最重要的一点是通过for循环来判断每一位是否为零,如果不为零则为这一位寻找它的中文字。如果为零则判断它的前一位和这一位是不是都为零,如果都为零,则取模哪里就决定了不转换,若有一个0,则补上一个“零”。