博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[源码]NumberToUpper 数字转中文
阅读量:6431 次
发布时间:2019-06-23

本文共 7815 字,大约阅读时间需要 26 分钟。

 

使用时需开启unsafe选项

构造函数有4个参数

number : 数字文本

isSimplified : 是否只使用简体中文,默认:false

isMoney : 是否是金额模式(忽略小数点后3位,并加上单位"元,角,分或整"),否认:true

veryBig : 是否开启大数字文本模式(接受15位以上整数,及10位以上小数),否认:false

 

using System;using System.ComponentModel;using System.Text;using System.Text.RegularExpressions;namespace blqw{    public static class NumberToUpper    {        #region 固定参数        //^[-+]?\d*(?
[.])?\d*$ readonly static Regex CheckNumber = new Regex(@"^[\s\t]*0*(?
[-+]?\d*)[.]?(?
\d*[1-9])?[0]*[\s\t]*$", RegexOptions.Compiled); readonly static string[] UpperNumbers = { "零壹貳叁肆伍陸柒捌玖點", "零一二三四五六七八九点" }; readonly static string[] NumberUnits = { "仟萬拾佰億負", "千万十百亿负" }; readonly static string[] MoneyUnits = { "圓角分", "元角分" }; #endregion ///
将数字文本转换成大写 /// ///
数字文本 ///
是否只使用简体中文,默认:否 ///
是否是金额模式(忽略小数点后3位,并加上单位"元,角,分或整"),否认:是 ///
是否开启大数字文本模式(接受15位以上整数,及10位以上小数),否认:否 public static string Go(string number, bool isSimplified = false, bool isMoney = true, bool veryBig = false) { if (number == null) { throw new ArgumentNullException("number", "number不能为空"); } //number = number.Trim(' ', '\t'); //去掉多余的空格,制表符 var m = CheckNumber.Match(number); if (m.Success == false) { throw new ArgumentException("number不是数字", "number"); } unsafe { fixed (char* p = number) fixed (char* upnum = UpperNumbers[isSimplified.GetHashCode()]) fixed (char* numut = NumberUnits[isSimplified.GetHashCode()]) fixed (char* monut = MoneyUnits[isSimplified.GetHashCode()]) { var mdec = m.Groups["decimal"]; var mInt = m.Groups["integer"]; if (mInt.Length > 15 && veryBig == false) { throw new ArgumentException("不建议转换超过15位的整数,除非将veryBig参数设置为true", "number"); } if (mdec.Length > 10 && veryBig == false) { throw new ArgumentException("不建议转换超过10位的小,除非将veryBig参数设置为true", "number"); } string integer = ParseInteger(p + mInt.Index, p + mInt.Index + mInt.Length - 1, upnum, numut); if (mdec.Success == false) { string unit = null; if (isMoney) unit = monut[0].ToString() + "整"; return integer + unit; } else { if (isMoney) { string jiao = upnum[p[mdec.Index] - '0'].ToString(); string fen = mdec.Length == 1 ? "0" : upnum[p[mdec.Index + 1] - '0'].ToString(); if (jiao != "0") { jiao += monut[1]; } if (fen != "0") { jiao += fen + monut[2]; } return integer + monut[0].ToString() + jiao; } else { return integer + ParseDecimal(p + mdec.Index, p + mdec.Index + mdec.Length - 1, upnum); } } } } } //操作小数部分 static unsafe string ParseDecimal(char* p, char* end, char* upnum) { StringBuilder sb = new StringBuilder((int)(end - p)); sb.Append(upnum[10]); while (p <= end) { sb.Append(upnum[*p - '0']); p++; } return sb.ToString(); } //操作整数部分,为了效率不写递归..... static unsafe string ParseInteger(char* p, char* end, char* upnum, char* numut) { int length = (int)(end - p) + 1; StringBuilder sb = new StringBuilder(length * 3); if (*p == '-') { sb.Append(numut[5]); p++; length--; if (*p == '.') { sb.Append(upnum[5]); } } else if (*p == '+') { p++; length--; } bool ling = false; bool yi = false; bool wan = false; while (p <= end) { int num = *p - '0'; //获得当前的数0-9 if (num != 0 && ling == true)//需要加 零 { sb.Append(upnum[0]); ling = false; //重置 参数 } if (length % 8 == 1) //判断是否在"亿"位 { //如果是 int n = length / 8; //计算应该有几个"亿" if (num != 0 || yi == true) //判断是否需要加 单位 { if (num != 0) //如果不为 0 { sb.Append(upnum[num]); //加入字符串 } if (n > 0) sb.Append(numut[4], n); if (ling) ling = false; //重置 参数 yi = false; //重置 参数 if (wan) wan = false; //重置 参数 } } else //十千百万 { var uIndex = length % 4; //单位索引 if (uIndex == 1) //判断是否在"万"位 { if (num != 0 || wan == true) //判断是否需要加 单位 { if (num != 0) //如果不为 0 { sb.Append(upnum[num]); //加入字符串 } sb.Append(numut[uIndex]); if (ling) ling = false; //重置 参数 wan = false; //重置 参数 if (!yi) yi = true; //设定 参数 } } else //十千百 { if (num != 0) //如果不为 0 { if ((uIndex == 2 && num == 1) == false) //排除 "一十二" 只显示 "十二" { sb.Append(upnum[num]); //加入字符串 } sb.Append(numut[uIndex]);//加入单位 if (!yi) yi = true; //设定 参数 if (!wan) wan = true; //设定 参数 } else if (ling == false) { ling = true; } } } length--; p++; } return sb.ToString(); } }}
View Code
var str = NumberToUpper.Go("467412346546454.4564768");Console.WriteLine(str);str = NumberToUpper.Go("467412346546454.4564768", true);Console.WriteLine();Console.WriteLine(str);str = NumberToUpper.Go("467412346546454.4564768", false, false);Console.WriteLine();Console.WriteLine(str);str = NumberToUpper.Go("7672313576513214657465413244563203246.1235", false, false, true);Console.WriteLine();Console.WriteLine(str);

 

转载地址:http://zmtga.baihongyu.com/

你可能感兴趣的文章
D3 & Data Visualization in Ext JS
查看>>
java通过UUID生成16位唯一订单号
查看>>
001-web基本程序搭建
查看>>
函数指针和指针函数
查看>>
借力AI 极验如何构建下一代业务安全?
查看>>
用Python制作迷宫GIF
查看>>
支付宝推出基于区块链跨境支付,巨头入场小企业将面临灭顶之灾
查看>>
从事互联网行业,怎样才能快速掌握一门编程语言呢?
查看>>
React native 第三方组件 React native swiper
查看>>
接口幂等设计
查看>>
编程入门指南
查看>>
移动端的自适应方案—REM
查看>>
你真的懂volatile吗
查看>>
Android 编译时注解-提升
查看>>
说说 Spring AOP 中 @Aspect 的高级用法
查看>>
Workbox CLI中文版
查看>>
贝聊亿级数据库分库分表实践
查看>>
同时连接gitlab和github
查看>>
vuex源码分析
查看>>
tornado+datatables分页
查看>>