您的位置:首页 > 其它

真正正确的人民币 小写 大写 转换算法

2010-07-13 22:30 302 查看
网上很多人民币数字转换成人民币大写的算法,但是,按照财务的规则,没有一个是对的。

于是我按照财务的规则重新写了一次这个逻辑

首先来看财务的大写人民币规则

(一) 阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖元伍角。

(二) 阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6,007.14,应写成人民币陆仟零柒元壹角肆分。
(三) 阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但仟位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1,680.32,应写成人民币壹仟陆佰捌拾元零三角贰分,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟元伍角叁分。
(四) 阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾元零肆分。


C#代码有点区别,但是经过测试是没有问题的

(代码中包含了 小写转换,例如 1709.5 会转换成¥1709.50 )

private string TryConverRMBCharToChar(string p)
{
string RMBStr = "";
double money;
if (double.TryParse(p, out money))
{
double temp= money*100;
string cent = (temp % 10).ToString();
temp/= 10;
string _10cent = temp>=1?((int)(temp % 10)).ToString():(cent == "¥"||cent == string.Empty?string.Empty:"¥");
temp/=10;
string yuan = temp >= 1 ? ((int)(temp % 10)).ToString() : (_10cent == "¥" || _10cent == string.Empty ? string.Empty : "¥");
temp /= 10;
string _10 = temp >= 1 ? ((int)(temp % 10)).ToString() : (yuan == "¥" || yuan == string.Empty ? string.Empty : "¥");
temp /= 10;
string _100 = temp >= 1 ? ((int)(temp % 10)).ToString() : (_10 == "¥" || _10 == string.Empty ? string.Empty : "¥");
temp /= 10;
string _K = temp >= 1 ? ((int)(temp % 10)).ToString() : (_100 == "¥" || _100 == string.Empty ? string.Empty : "¥");
temp /= 10;
string _10K = temp >= 1 ? ((int)(temp % 10)).ToString() : (_K == "¥" || _K == string.Empty ? string.Empty : "¥");
temp /= 10;
string _100K = temp >= 1 ? ((int)(temp % 10)).ToString() : (_10K == "¥" || _10K == string.Empty ? string.Empty : "¥");
temp /= 10;
string _M = temp >= 1 ? ((int)(temp % 10)).ToString() : (_100K == "¥" || _100K == string.Empty ? string.Empty : "¥");
temp /= 10;
string _10M = temp >= 1 ? ((int)(temp % 10)).ToString() : (_M == "¥" || _M == string.Empty ? string.Empty : "¥");
temp /= 10;
string _100M = temp >= 1 ? ((int)(temp % 10)).ToString() : (_10M == "¥" || _10M == string.Empty ? string.Empty : "¥");
label100M.Text = label100MCopy.Text = _100M.ToString();
label10M.Text = label10MCopy.Text = _10M.ToString();
labelM.Text = labelMCopy.Text = _M.ToString();
label100K.Text = label100KCopy.Text = _100K.ToString();
label10K.Text = label10KCopy.Text = _10K.ToString();
labelK.Text = labelKCopy.Text = _K.ToString();
label100.Text = label100Copy.Text = _100.ToString();
label10.Text = label10Copy.Text = _10.ToString();
labelYuan.Text = labelYuanCopy.Text = yuan.ToString();
label10Cent.Text = label10CentCopy.Text = _10cent.ToString();
labelCent.Text = labelCentCopy.Text = cent.ToString();

if (!string.IsNullOrEmpty(_100M) && _100M != "¥")
{
if (_100M == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(_100M) + "亿";
}
}
if (!string.IsNullOrEmpty(_10M) && _10M != "¥")
{
if (_10M == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(_10M) + "仟";
}
}
if (!string.IsNullOrEmpty(_M) && _M != "¥")
{
if (_M == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(_M) + "佰";
}
}
if (!string.IsNullOrEmpty(_100K) && _100K != "¥")
{
if (_100K == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(_100K) + "拾";
}
}
if (!string.IsNullOrEmpty(_10K) && _10K != "¥")
{
if (_10K == "0")
{
RMBStr += "万零";
}
else
{
RMBStr += ConverRMBNOToStr(_10K) + "万";
}
}
if (!string.IsNullOrEmpty(_K) && _K != "¥")
{
if (_K == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(_K) + "仟";
}
}
if (!string.IsNullOrEmpty(_100) && _100 != "¥")
{
if (_100 == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(_100) + "佰";
}
}
if (!string.IsNullOrEmpty(_10) && _10 != "¥")
{
if (_10 == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(_10) + "拾";
}
}
if (!string.IsNullOrEmpty(yuan) && yuan != "¥")
{
if (yuan == "0")
{
RMBStr += "元零";
}
else
{
RMBStr += ConverRMBNOToStr(yuan) + "元";
}
}

if (!string.IsNullOrEmpty(_10cent) && _10cent != "¥")
{
if(_10cent == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(_10cent) + "角";
}
}
if (!string.IsNullOrEmpty(cent) && cent != "¥")
{
if (cent == "0")
{
RMBStr += "零";
}
else
{
RMBStr += ConverRMBNOToStr(cent) + "分";
}
}

if (string.IsNullOrEmpty(cent) || cent == "0")
{
RMBStr += "整";
}
RMBStr = RemoveZero(RMBStr);
RMBStr = RemoveLastZero(RMBStr);

}
return RMBStr;
}
private string RemoveLastZero(string RMBStr)
{
if (RMBStr.Substring(RMBStr.Length - 1) == "零")
{
return RMBStr.Remove(RMBStr.Length - 1);
}
else
return RMBStr;
}
private string RemoveZero(string RMBStr)
{
if (RMBStr.IndexOf("零零") > 0)
{
RMBStr = RMBStr.Replace("零零", "零");
return RemoveZero(RMBStr);
}
else if (RMBStr.IndexOf("零万零") > 0)
{
RMBStr = RMBStr.Replace("零万零", "万零");
return RemoveZero(RMBStr);
}
else if (RMBStr.IndexOf("零元零") > 0)
{
RMBStr = RMBStr.Replace("零元零", "元零");
return RemoveZero(RMBStr);
}
else if (RMBStr.IndexOf("零整") > 0)
{
RMBStr = RMBStr.Replace("零整", "整");
return RemoveZero(RMBStr);
}
else
{
return RMBStr;
}
}
private string ConverRMBNOToStr(string p)
{
switch (p)
{
case "1": return "壹"; break;
case "2": return "贰"; break;
case "3": return "叁"; break;
case "4": return "肆"; break;
case "5": return "伍"; break;
case "6": return "陆"; break;
case "7": return "柒"; break;
case "8": return "捌"; break;
case "9": return "玖"; break;
default: return " "; break;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: