C# 将金额数字转换为中文大写人民币实例
在开发涉及财务、发票或交易记录的 C# 应用程序时,经常需要将阿拉伯数字金额转换为规范的中文大写形式(如:壹佰贰拾叁元肆角伍分)。本方案提供了一套完整的 C# 类实现,支持自动处理小数位、零值以及“整”字的添加。
结果与目标
输入标准的小数金额(如 123.45),程序输出对应的中文大写字符串。该方法适用于 WinForm、WPF 或 Web 应用中的后端逻辑,确保金额显示的合规性。
准备条件
- 开发环境:Visual Studio 或其他 C# 编译器。
- 依赖命名空间:
System,System.Collections.Generic,System.Linq,System.Text。
第1步:创建 EcanRMB 转换类
定义一个名为 EcanRMB 的公共类,核心功能是 CmycurD 方法。该算法通过字符映射表将数字逐位转换为汉字,并处理亿、万、元等量级单位。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Jxc.WinClient.BLL
{
public class EcanRMB
{
/// <summary>
/// 转换人民币大小金额
/// </summary>
/// <param name="num">金额</param>
/// <returns>返回大写形式</returns>
public string CmycurD(decimal num)
{
string str1 = "零壹贰叁肆伍陆柒捌玖"; //0-9所对应的汉字
string str2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; //数字位所对应的汉字
string str3 = ""; //从原num值中取出的值
string str4 = ""; //数字的字符串形式
string str5 = ""; //人民币大写金额形式
int i; //循环变量
int j; //num的值乘以100的字符串长度
string ch1 = ""; //数字的汉语读法
string ch2 = ""; //数字位的汉字读法
int nzero = 0; //用来计算连续的零值是几个
int temp; //从原num值中取出的值
num = Math.Round(Math.Abs(num), 2); //将num取绝对值并四舍五入取2位小数
str4 = ((long)(num * 100)).ToString(); //将num乘100并转换成字符串形式
j = str4.Length; //找出最高位
if (j > 15) { return "溢出"; }
str2 = str2.Substring(15 - j); //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分
//循环取出每一位需要转换的值
for (i = 0; i < j; i++)
{
str3 = str4.Substring(i, 1); //取出需转换的某一位的值
temp = Convert.ToInt32(str3); //转换为数字
if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15))
{
//当所取位数不为元、万、亿、万亿上的数字时
if (str3 == "0")
{
ch1 = "";
ch2 = "";
nzero = nzero + 1;
}
else
{
if (str3 != "0" && nzero != 0)
{
ch1 = "零" + str1.Substring(temp * 1, 1);
ch2 = str2.Substring(i, 1);
nzero = 0;
}
else
{
ch1 = str1.Substring(temp * 1, 1);
ch2 = str2.Substring(i, 1);
nzero = 0;
}
}
}
else
{
//该位是万亿,亿,万,元位等关键位
if (str3 != "0" && nzero != 0)
{
ch1 = "零" + str1.Substring(temp * 1, 1);
ch2 = str2.Substring(i, 1);
nzero = 0;
}
else
{
if (str3 != "0" && nzero == 0)
{
ch1 = str1.Substring(temp * 1, 1);
ch2 = str2.Substring(i, 1);
nzero = 0;
}
else
{
if (str3 == "0" && nzero >= 3)
{
ch1 = "";
ch2 = "";
nzero = nzero + 1;
}
else
{
if (j >= 11)
{
ch1 = "";
nzero = nzero + 1;
}
else
{
ch1 = "";
ch2 = str2.Substring(i, 1);
nzero = nzero + 1;
}
}
}
}
}
if (i == (j - 11) || i == (j - 3))
{
//如果该位是亿位或元位,则必须写上
ch2 = str2.Substring(i, 1);
}
str5 = str5 + ch1 + ch2;
if (i == j - 1 && str3 == "0")
{
//最后一位(分)为0时,加上“整”
str5 = str5 + '整';
}
}
if (num == 0)
{
str5 = "零元整";
}
return str5;
}
/**/
/// <summary>
/// 一个重载,将字符串先转换成数字在调用CmycurD(decimal num)
/// </summary>
/// <param name="num">用户输入的金额,字符串形式未转成decimal</param>
/// <returns></returns>
public string CmycurD(string numstr)
{
try
{
decimal num = Convert.ToDecimal(numstr);
return CmycurD(num);
}
catch
{
return "非数字形式!";
}
}
}
}
第2步:在实际业务中调用
在 UI 层(如 WinForm 的 Button Click 事件或 Page_Load 事件中)实例化该类,并对用户输入进行清洗后调用。注意:输入前建议去除千分位逗号和非数字字符,以避免解析错误。
// 实例化对象
EcanRMB rmb = new EcanRMB();
// 假设 txtAmount 是用户输入的文本框,获取并清洗文本
string Rmb = txtAmount.Text.Replace(",", "").Replace("-",".");
// 调用转换方法,显示在标签中
label9.Text = rmb.CmycurD(Rmb);
// 可选:同时格式化原始金额显示
label11.Text = Convert.ToDecimal(txtAmount.Text).ToString("###,###,###.00");
完成判断
运行代码后,检查 label9 是否输出了预期的中文大写格式。例如输入 100.00 应显示 壹佰元整,输入 100.10 应显示 壹佰元壹角。
简要总结
以上是将 C# 金额数字转换为中文大写人民币的详细内容。该实现覆盖了基础的进制转换与特殊零值处理逻辑,可直接集成到现有的财务模块中。更多关于 C# 数据处理与工具类开发的资料,请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













