C#金额转大写的方法

最近搞的项目里面有个财务模块,需要把数字金额转为大写显示,网上搜了一下要么代码太繁琐要么不符合书写习惯(会出现零佰零仟,整数没有结尾之类的问题),于是琢磨了一下自己写了个方法。原理很简单,就是循环替换数字,添加单位,然后再来一个循环排除例外情况。

代码如下:

        public string NumtoChinese(decimal s)
        {
            s = Math.Round(s, 2);//四舍五入到两位小数,即分
            string[] n = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
            //数字转大写
            string[] d = { "", "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };
            //不同位置的数字要加单位
            List needReplace = new List { "零拾", "零佰", "零仟", "零万","零亿","亿万", "零元", "零零", "零角", "零分" };
            List afterReplace = new List { "零", "零", "零", "万","亿","亿", "元", "零", "", "" };//特殊情况用replace剔除
            string b = "人民币";//开头
            string e = s % 1 == 0 ? "整" : "";//金额是整数要加一个“整”结尾
            string re = "";
            Int64 a = (Int64)(s * 100);
            int k = 1;
            while (a != 0)
            {//初步转换为大写+单位
                re = n[a % 10] + d[k] + re;
                a = a / 10;
                k = k < 11 ? k + 1 : 4;
            }
            string need = needReplace.Where(tb => re.Contains(tb)).FirstOrDefault();
            while (need != null)
            {
                int i = needReplace.IndexOf(need);
                re = re.Replace(needReplace[i], afterReplace[i]);
                need = needReplace.Where(tb => re.Contains(tb)).FirstOrDefault();
            }//循环排除特殊情况
            re = re == "" ? "" : b + re + e;
            return re;
        }

输出结果以“人民币”开头,整数金额以“整”结尾,阿拉伯数字出现多个连续的0时会替换为显示一个“零”。

常见的不符合规范的输出都做了替换,如果有例外直接在needReplace和afterReplace中添加即可。

测试了一下,由于Int64长度限制,在金额达到亿亿数量级时会出现溢出错误(不过也没人会用这么大的金额吧,懒得改了)

你可能感兴趣的:(C#金额转大写的方法)