阿拉伯数字转大写金额(支持简体和繁体)
曾经在N年前,也写过一个阿拉伯数字转大写金额的代码,但那时候对正则还不是很了解,Replace写的一长串一长串,现在用正则后,妥妥的几次Replace搞定,与其它转换代码相比,当然也要有点独特(或者说是画蛇添足)的地方,同时支持简体与繁体,好歹台湾同胞们用的都是繁体不是?当然大写金额国内也认可繁体的说……
代码不多,就一个枚举和一个静态类
枚举ChineseLanguage用于确认要转化成哪种中文
public enum ChineseLanguage{/// <summary>/// 简体/// </summary>SimplifiedChinese = 0,/// <summary>/// 繁体/// </summary>TraditionalChinese = 1}
ConvertIAmount为静态类,包含一个公开的扩展方法和两个私有的静态方法
using System.Text;using System.Text.RegularExpressions;public static class ConvertIAmount{/// <summary>/// 中文的单位,不采用兆京等易产生误解的单位/// </summary>private static readonly string[] ChineseNumberUnits = { "万拾佰仟亿", "萬拾佰仟億" };/// <summary>/// 中文的数字/// </summary>private static readonly string[] ChineseNumbers = { "零壹贰叁肆伍陆柒捌玖", "零壹貳叁肆伍陸柒捌玖" };/// <summary>/// RMB计价单位/// </summary>private static readonly string[] RMBUnits = { "圆角分", "圓角分" };/// <summary>/// 将阿拉伯数字转换为中文人民币书写 /// </summary>/// <param name="number">要转换的阿拉伯数字</param>/// <param name="language">要转化为哪种中文,默认简体</param>/// <returns></returns>public static string ConvertChIAmount(this decimal number, ChineseLanguage language = ChineseLanguage.SimplifiedChinese){if (number < 0){throw new Exception("The number you want to change must be greater then zero.");}var integerPartNumber = decimal.ToUInt64(number);//整数部分string integerPart = ConvertIntegerPart(integerPartNumber, language);string decimalPart = ConvertDecimalPart((byte)((number - integerPartNumber) * 100), language);//低于二位的小数直接舍弃,不存在什么进制if (string.IsNullOrEmpty(decimalPart)){//不包含小数时,增加 整 标志return string.Format("{0} 整", integerPart);}else{//组织字符串并移除零圆(零圓)return string.Format("{0} {1}", integerPart, decimalPart).Trim(ChineseNumbers[0][0], RMBUnits[0][0], RMBUnits[1][0]).Trim();}}/// <summary>/// 转化整数部分/// </summary>/// <param name="number">ulong.Max=1844 6744 0737 0955 1615</param>/// <param name="language"></param>/// <returns></returns>private static string ConvertIntegerPart(ulong number, ChineseLanguage language){string numbers = ChineseNumbers[(int)language];string rmbUnits = RMBUnits[(int)language];string numberUnits = ChineseNumberUnits[(int)language];string returnStr;StringBuilder tmp = new StringBuilder();tmp.Append(rmbUnits[0]);//圆(圓)for (var i = 0; ; i++){if (i > 0){if (i % 8 == 0){tmp.Insert(0, numberUnits[4]);//亿(億)}else{tmp.Insert(0, numberUnits[i % 4]);//万(萬)拾佰仟}}var tmpInt = number % 10;tmp.Insert(0, numbers[(int)tmpInt]);number /= 10;if (number == 0) { break; }}string zero = numbers[0].ToString();//将 零[拾佰仟] 替换成 零returnStr = Regex.Replace(tmp.ToString(), string.Format("{0}[{1}{2}{3}]", numbers[0], numberUnits[1], numberUnits[2], numberUnits[3]), zero);//将 零{2,} 替换成 零returnStr = Regex.Replace(returnStr, string.Format("[{0}]{{2,}}", numbers[0]), zero);//将 零(?=[万亿]) 替换成 空格returnStr = Regex.Replace(returnStr, string.Format("{0}(?=[{1}{2}])", numbers[0], numberUnits[0], numberUnits[4]), string.Empty);//将 (?<=[亿])万 替换成 空格returnStr = Regex.Replace(returnStr, string.Format("(?<=[{0}]){1}", numberUnits[4], numberUnits[0]), string.Empty);//将 (?<=[万拾佰仟亿])零(?=圆) 替换成 空格returnStr = Regex.Replace(returnStr, string.Format("(?<=[{0}]){1}(?={2})", numberUnits, numbers[0], rmbUnits[0]), string.Empty);return returnStr;}/// <summary>/// 转化小数部分/// </summary>/// <param name="number"></param>/// <param name="language"></param>/// <returns></returns>private static string ConvertDecimalPart(byte number, ChineseLanguage language){string returnStr = string.Empty;if (number > 0){string numbers = ChineseNumbers[(int)language];string rmbUnits = RMBUnits[(int)language];returnStr = string.Format("{0}{1}{2}{3}", numbers[number / 10], rmbUnits[1], numbers[number % 10], rmbUnits[2]);//将 零[角分] 替换成 空格returnStr = Regex.Replace(returnStr, string.Format("{0}[{1}{2}]", numbers[0], rmbUnits[1], rmbUnits[2]), string.Empty);}return returnStr;}}
下面是测试代码
Console.WriteLine(ConvertIAmount.ConvertChIAmount(10000000100010.01m, ChineseLanguage.TraditionalChinese));//壹拾萬億零壹拾萬零壹拾圓 壹分
Console.WriteLine(ConvertIAmount.ConvertChIAmount(10000000100010.01m));壹拾万亿零壹拾万零壹拾圆 壹分
Console.WriteLine(ConvertIAmount.ConvertChIAmount(12060000100010.01m));//壹拾贰万零陆佰亿零壹拾万零壹拾圆 壹分
Console.WriteLine(ConvertIAmount.ConvertChIAmount(12060000100010.01m, ChineseLanguage.TraditionalChinese));//壹拾貳萬零陸佰億零壹拾萬零壹拾圓 壹分
写完看到一个帖子的29楼(方法里面double要改成decimal,不然在大数字的情况下会精度丢失)我就自卑了
阿拉伯数字转大写金额(支持简体和繁体)相关推荐
- 支持 简体,繁体,英文的js日历控件
1 js文件下载地址 http://download.csdn.net/detail/jianfpeng241241/8293955 2 调用方法 在liferay 的jsp中 <script ...
- 页面支持简体和繁体语言的js库
var Default_isFT = 0 var StranIt_Delay = 50 function StranText(txt, toFT, chgTxt) {if (txt == " ...
- Win11怎么改系统语言?Win11系统语言简体改繁体的方法
Win11怎么改系统语言?有时候我们电脑下载安装系统之后,发现该系统语言不是自己常用的,因此还需要更换系统语言,那么应该如何操作呢?今天小编就为大家带来Win11系统语言简体改繁体的方法,而且用类似的 ...
- Opencc简体、繁体转换
除了写代码进行简体.繁体转换外,opencc也支持命令行进行转换. opencc --help可以看到具体信息. 参数: -i [file], --input=[file] 从 [file] 读 ...
- 字体转换接口实现简体、繁体、火星文之间的转换
字体转换接口实现简体.繁体.火星文之间的转换 接口名称:字体转换接口 接口平台:api接口 接口地址:http://japi.juhe.cn/charconvert/change.from 支持格式: ...
- 使用微软的 Visual Studio International Pack 1.0 进行网站简体与繁体的互转和得到汉字、拼音、笔画等相关信息...
2009年3月31日,微软发布了 Microsoft Visual Studio International Pack 1.0 SR1.Visual Studio International Pack ...
- C# 简体与繁体互转,汉字取拼音、笔画、读音
先给各位推荐下这个库: 这两个提供这是微软亚洲汉字开发中心开发的,下面是说明: 2009年3月31日,微软发布了 Microsoft Visual Studio International Pack ...
- windows使用opencc中文简体和繁体互转 12.8
转自:https://blog.csdn.net/sinat_29957455/article/details/81290356 OpenCC git项目地址 一.OpenCC介绍 OpenCC是一款 ...
- python tkinter 中文文档_Python实现中文文档的简体与繁体互相转换
封面图片:<Python程序设计实验指导书>,董付国编著,清华大学出版社,2019.4 ============= 本文重点是一个第三方工具的使用,首先从下面的地址下载这两个文件并存放于程 ...
最新文章
- 如何破解压缩文件密码-省时省力的方法
- Confluence 6 导入 SSL 证书和问题解决
- 小程序-云开发部署流程(步骤二)
- html语言难不难学,Web前端开发难学吗?
- 机器人学习--激光slam简单案例版学习参考(转)
- jquery可编辑表格(版本二)
- 自由口通信模式下计算机读写PLC存储区的程序
- VS中发布并调试IIS程序(非附加进程!!!)
- linux的/dev内容介绍
- 信息技术处理员和计算机二级,信息处理技术员(信息技术处理员含金量)
- 这款开源带采集的漫画cms,宅男的大爱
- Java、JSP汽车租赁管理系统
- JAVA随机生成中文姓名,性别,Email,手机号,住址
- 自律给你自由——Android设计布局的新姿势
- 喜大普奔!Maya 2022来了?!
- 树莓派开机不加载桌面全屏启动chromium浏览器
- hdu 4416 后缀数组
- 阿里云Code设置ssh公钥
- 图书馆信息管理系统(毕业设计)
- mybatis ognl表达式