public class Num2Cn
{
#region private Datas
static readonly string[] cnStr = new string[] { "千", "百", "十", "" };
static readonly string[] numStr = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
static bool ZeroBefore;
#endregion
#region The only public method,if valid,return the result,else return the ErrorMessage
public static string ConvertToZhCN(string num)
{
//init
ZeroBefore = false;
///
num = filter(num);
if (!IsValid(num))
return "输入值不是数字或大于18位";
return Translate(num, 0);
}
#endregion
#region CheckMethods,just to check if the input is valid or not
static bool IsValid(string num)
{
if (num.Length > 18)
return false;
for (int i = 0; i < num.Length; i++)
{
if (num[i] < '0' || num[i] > '9')
return false;
}
return true;
}
static string filter(string input)
{
for (int i = 0; i < input.Length; i++)
{
if (input[i] != '0')
return input.Substring(i);
}
return "0";
}
#endregion
#region Translation Methods
static string MapCnStr(char input)
{
int x = Convert.ToInt32(input);
return numStr[x - 48];
}
static string Translate(string input, int layer)
{
switch (layer)
{
case 0:
if (input.Length > 4)
return Translate(input.Remove(input.Length - 4), layer + 1) +
"万" + TranslateUnit(input.Substring(input.Length - 4));
else
return TranslateUnit(input);
case 1:
if (input.Length > 4)
return Translate(input.Remove(input.Length - 4), layer + 1) +
"亿" + Translate(input.Substring(input.Length - 4), layer - 1);
else
return Translate(input, layer - 1);
case 2:
if (input.Length > 8)
return Translate(input.Remove(input.Length - 8), layer + 1) +
"兆" + Translate(input.Substring(input.Length - 8), layer - 1);
else
return Translate(input, layer - 1);
default:
return "";
}
}
static string TranslateUnit(string input)
{
StringBuilder sb = new StringBuilder();
int offset = 4 - input.Length;
for (int i = 0; i < input.Length; i++)
{
if (input[i] == '0')
{
if (ZeroBefore)
continue;
else
{
ZeroBefore = true;
sb.Append(MapCnStr(input[i]));
}
}
else
{
ZeroBefore = false;
sb.Append(MapCnStr(input[i]) + cnStr[i + offset]);
}
}
if (sb[sb.Length - 1] == '零' && sb.Length > 1)
sb.Remove(sb.Length - 1, 1);
//edit by lxj 2012-09-25 10,11去掉前面的一,成十,十一
if (sb.Length >= 2)
{
if (sb[0] == '一' && sb[1] == '十')
{
sb.Remove(0, 1);
}
}
return sb.ToString();
}
#endregion
}
调用:Num2Cn.ConvertToZhCN("1");