C# 金额转中文大写

今天看到一个库是把金额转中文大写,看起来很容易,所以我就自己写了。

创建的项目是创建一个 dot net core 的项目,实际上这个项目可以创建为 Stand 的。

首先创建类,这个类的构造传入一个 double 作为人民币

    public class Money
    {
        public Money(double money)
        {
            _money = money;
        }

        private double _money;
  }

然后创建方法转换

        public string ToCapital()
        {
            if (Math.Abs(_money) < 0.0001)
            {
                return "零元";
            }

            var str = GetIntPart();
            GetDecimalPart(str);
            return str.ToString();
        }

其中 GetIntPart 是转换小数点前的部分,小数点之后的使用 GetDecimalPart 计算。

然后创建一些使用的数组

        private static readonly List<char> Uppers = new List<char>()
        {
            '零',
            '壹',
            '贰',
            '叁',
            '肆',
            '伍',
            '陆',
            '柒',
            '捌',
            '玖'
        };

        private static readonly List<char> Units = new List<char>()
        {
            '分',
            '角'
        };

        private static readonly List<char> Grees = new List<char>()
        {
            '元',
            '拾',
            '佰',
            '仟',
            '万',
            '拾',
            '佰',
            '仟',
            '亿',
            '拾',
            '佰',
            '仟',
            '万',
            '拾',
            '佰'
        };

转换小数点前的代码

           StringBuilder str = new StringBuilder();
            var money = _money;
        
            for (int i = 0; money > 0.99999; i++)
            {
                var n = (int) (money % 10);
                str.Insert(0,Grees[i]);
                str.Insert(0,Uppers[n]);
                money = money / 10;
                money = money - n / 10.0;
            }

但是这样转换得到的存在一些零,如输入 100 会输出 壹佰零拾零元 ,所以需要对输出转换

        private StringBuilder GetIntPart()
        {
            StringBuilder str = new StringBuilder();
            var money = _money;

            for (int i = 0; money > 0.99999; i++)
            {
                var n = (int) (money % 10);
                str.Insert(0, Grees[i]);
                str.Insert(0, Uppers[n]);
                money = money / 10;
                money = money - n / 10.0;
            }

            str = str.Replace("零亿", "亿零");
            str = str.Replace("零万", "万零");

            str = str.Replace("零拾", "零");
            str = str.Replace("零佰", "零");
            str = str.Replace("零仟", "零");

            str = str.Replace("零零", "零");
            str = str.Replace("零零", "零");

            str = str.Replace("零亿", "亿");
            str = str.Replace("零万", "万");
            str = str.Replace("零元", "元");

            return str;
        }

转换小数的代码

        private void GetDecimalPart(StringBuilder str)
        {
            var money = _money * 100;
            for (int i = 0; i < 2; i++)
            {
                var n = (int) (money % 10);
                if (n != 0)
                {
                    str.Insert(0, Units[i]);
                    str.Insert(0, Uppers[n]);
                }

                money = money / 10;
            }
        }

所有代码

代码请看 https://gitee.com/lindexi/codes/w6bxlue9o14rv5nscjyhf20

参见:src/Money.php · 趋势软件/capital - 码云 Gitee.com


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习之路

02 Spring框架 简单配置和三种bean的创建方式

整理了一下之前学习Spring框架时候的一点笔记。如有错误欢迎指正,不喜勿喷。 上一节学习了如何搭建SpringIOC的环境,下一步我们就来讨论一下如何利...

3215
来自专栏积累沉淀

Linux之grep和egrep命令总结

grep / egrep 语法: grep  [-cinvABC]  'word'  filename -c :打印符合要求的行数 -i :忽略大小写 ...

18810
来自专栏java一日一条

Java 并发开发:内置锁 Synchronized

在多线程编程中,线程安全问题是一个最为关键的问题,其核心概念就在于正确性,即当多个线程访问某一共享、可变数据时,始终都不会导致数据破坏以及其他不该出现的结果。而...

732
来自专栏coolblog.xyz技术专栏

MyBatis 源码分析 - 配置文件解析过程

由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括。本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于se...

932
来自专栏一名合格java开发的自我修养

springMVC参数绑定

处理器形参中添加如下类型的参数处理注解适配器会默认识别并进行赋值。 1 HttpServletRequest 通过request对象获取请求信息 2 Htt...

992
来自专栏青青天空树

json简单使用

  其中一个解决方法是在服务器端将将数据封装成json格式,然后传给前台。废话不多说,下面讲干货。

1791
来自专栏微信公众号:Java团长

Java基础知识详细总结

ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类...

1293
来自专栏java一日一条

50个常见的 Java 错误及避免方法(第二部分)

System.out.println("Whatdo you want to do?");

1143
来自专栏Jerry的SAP技术分享

Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序

文章的标题看似自相矛盾,然而我在“正确”二字上打了引号。我们来看一个例子,关于Java异常处理(Exception Handling)的一些知识点。

1273
来自专栏java闲聊

POI之easypoi操作(二)

7205

扫码关注云+社区

领取腾讯云代金券