C# 将金额数字转换为中文大写人民币实例

宋时安
宋时安
发布时间:2026-10-14| 5人浏览过
原创

在开发涉及财务、发票或交易记录的 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# 数据处理与工具类开发的资料,请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。