使用时需开启unsafe选项

构造函数有4个参数

number : 数字文本

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

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

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

  1. using System;
  2. using System.ComponentModel;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5.  
  6. namespace blqw
  7. {
  8. public static class NumberToUpper
  9. {
  10. #region 固定参数
  11. //^[-+]?\d*(?<point>[.])?\d*$
  12. readonly static Regex CheckNumber = new Regex(@"^[\s\t]*0*(?<integer>[-+]?\d*)[.]?(?<decimal>\d*[1-9])?[0]*[\s\t]*$", RegexOptions.Compiled);
  13.  
  14. readonly static string[] UpperNumbers =
  15. {
  16. "零壹貳叁肆伍陸柒捌玖點",
  17. "零一二三四五六七八九点"
  18. };
  19. readonly static string[] NumberUnits =
  20. {
  21. "仟萬拾佰億負",
  22. "千万十百亿负"
  23. };
  24. readonly static string[] MoneyUnits =
  25. {
  26. "圓角分",
  27. "元角分"
  28. };
  29.  
  30. #endregion
  31.  
  32. /// <summary> 将数字文本转换成大写
  33. /// </summary>
  34. /// <param name="number">数字文本</param>
  35. /// <param name="isSimplified">是否只使用简体中文,默认:否</param>
  36. /// <param name="isMoney">是否是金额模式(忽略小数点后3位,并加上单位"元,角,分或整"),否认:是</param>
  37. /// <param name="veryBig">是否开启大数字文本模式(接受15位以上整数,及10位以上小数),否认:否</param>
  38. public static string Go(string number, bool isSimplified = false, bool isMoney = true, bool veryBig = false)
  39. {
  40. if (number == null)
  41. {
  42. throw new ArgumentNullException("number", "number不能为空");
  43. }
  44. //number = number.Trim(' ', '\t'); //去掉多余的空格,制表符
  45. var m = CheckNumber.Match(number);
  46. if (m.Success == false)
  47. {
  48. throw new ArgumentException("number不是数字", "number");
  49. }
  50.  
  51. unsafe
  52. {
  53. fixed (char* p = number)
  54. fixed (char* upnum = UpperNumbers[isSimplified.GetHashCode()])
  55. fixed (char* numut = NumberUnits[isSimplified.GetHashCode()])
  56. fixed (char* monut = MoneyUnits[isSimplified.GetHashCode()])
  57. {
  58. var mdec = m.Groups["decimal"];
  59. var mInt = m.Groups["integer"];
  60. if (mInt.Length > && veryBig == false)
  61. {
  62. throw new ArgumentException("不建议转换超过15位的整数,除非将veryBig参数设置为true", "number");
  63. }
  64. if (mdec.Length > && veryBig == false)
  65. {
  66. throw new ArgumentException("不建议转换超过10位的小,除非将veryBig参数设置为true", "number");
  67. }
  68. string integer = ParseInteger(p + mInt.Index, p + mInt.Index + mInt.Length - , upnum, numut);
  69.  
  70. if (mdec.Success == false)
  71. {
  72. string unit = null;
  73. if (isMoney)
  74. unit = monut[].ToString() + "整";
  75. return integer + unit;
  76. }
  77. else
  78. {
  79. if (isMoney)
  80. {
  81. string jiao = upnum[p[mdec.Index] - ''].ToString();
  82. string fen = mdec.Length == ? "" : upnum[p[mdec.Index + ] - ''].ToString();
  83.  
  84. if (jiao != "")
  85. {
  86. jiao += monut[];
  87. }
  88.  
  89. if (fen != "")
  90. {
  91. jiao += fen + monut[];
  92. }
  93.  
  94. return integer + monut[].ToString() + jiao;
  95. }
  96. else
  97. {
  98. return integer + ParseDecimal(p + mdec.Index, p + mdec.Index + mdec.Length - , upnum);
  99. }
  100. }
  101. }
  102. }
  103.  
  104. }
  105.  
  106. //操作小数部分
  107. static unsafe string ParseDecimal(char* p, char* end, char* upnum)
  108. {
  109. StringBuilder sb = new StringBuilder((int)(end - p));
  110. sb.Append(upnum[]);
  111. while (p <= end)
  112. {
  113. sb.Append(upnum[*p - '']);
  114. p++;
  115. }
  116. return sb.ToString();
  117. }
  118.  
  119. //操作整数部分,为了效率不写递归.....
  120. static unsafe string ParseInteger(char* p, char* end, char* upnum, char* numut)
  121. {
  122. int length = (int)(end - p) + ;
  123. StringBuilder sb = new StringBuilder(length * );
  124.  
  125. if (*p == '-')
  126. {
  127. sb.Append(numut[]);
  128. p++;
  129. length--;
  130. if (*p == '.')
  131. {
  132. sb.Append(upnum[]);
  133. }
  134. }
  135. else if (*p == '+')
  136. {
  137. p++;
  138. length--;
  139. }
  140.  
  141. bool ling = false;
  142. bool yi = false;
  143. bool wan = false;
  144.  
  145. while (p <= end)
  146. {
  147. int num = *p - ''; //获得当前的数0-9
  148.  
  149. if (num != && ling == true)//需要加 零
  150. {
  151. sb.Append(upnum[]);
  152. ling = false; //重置 参数
  153. }
  154.  
  155. if (length % == ) //判断是否在"亿"位
  156. { //如果是
  157. int n = length / ; //计算应该有几个"亿"
  158.  
  159. if (num != || yi == true) //判断是否需要加 单位
  160. {
  161. if (num != ) //如果不为 0
  162. {
  163. sb.Append(upnum[num]); //加入字符串
  164. }
  165. if (n > ) sb.Append(numut[], n);
  166. if (ling) ling = false; //重置 参数
  167. yi = false; //重置 参数
  168. if (wan) wan = false; //重置 参数
  169. }
  170. }
  171. else //十千百万
  172. {
  173. var uIndex = length % ; //单位索引
  174. if (uIndex == ) //判断是否在"万"位
  175. {
  176. if (num != || wan == true) //判断是否需要加 单位
  177. {
  178. if (num != ) //如果不为 0
  179. {
  180. sb.Append(upnum[num]); //加入字符串
  181. }
  182. sb.Append(numut[uIndex]);
  183. if (ling) ling = false; //重置 参数
  184. wan = false; //重置 参数
  185. if (!yi) yi = true; //设定 参数
  186. }
  187. }
  188. else //十千百
  189. {
  190. if (num != ) //如果不为 0
  191. {
  192. if ((uIndex == && num == ) == false) //排除 "一十二" 只显示 "十二"
  193. {
  194. sb.Append(upnum[num]); //加入字符串
  195. }
  196. sb.Append(numut[uIndex]);//加入单位
  197. if (!yi) yi = true; //设定 参数
  198. if (!wan) wan = true; //设定 参数
  199. }
  200. else if (ling == false)
  201. {
  202. ling = true;
  203. }
  204. }
  205. }
  206.  
  207. length--;
  208. p++;
  209. }
  210. return sb.ToString();
  211. }
  212.  
  213. }
  214. }
  1. var str = NumberToUpper.Go("467412346546454.4564768");
  2. Console.WriteLine(str);
  3. str = NumberToUpper.Go("467412346546454.4564768", true);
  4. Console.WriteLine();
  5. Console.WriteLine(str);
  6. str = NumberToUpper.Go("467412346546454.4564768", false, false);
  7. Console.WriteLine();
  8. Console.WriteLine(str);
  9. str = NumberToUpper.Go("7672313576513214657465413244563203246.1235", false, false, true);
  10. Console.WriteLine();
  11. Console.WriteLine(str);

[源码]NumberToUpper 数字转中文的更多相关文章

  1. jmeter 源码修改返回值中文Unicode编码问题

    修改jmeter源码,可能会对其他格式的responseData有一定影响,图片或者其他 在 ListenerNotifier 类中找到 notifyListeners 方法,在其下面添加如下代码: ...

  2. THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序。

    问题:TP从服务器数据中取出的collection数据,当进一步在网页中进行分页显示时,需要调用order函数,实现类似如下图的排序. 当点击页面中的相关内容时,实现对服务器数据进行重排,就要调用TP ...

  3. vscode源码编译运行打包使其由英文变为中文

    vscode默认是英文,如果你想让其变为中文,可参考这个链接:https://blog.csdn.net/testcs_dn/article/details/75070415 最近发现一个很奇怪的问题 ...

  4. GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)

    以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...

  5. 16Aspx.com源码2013年10月到2013年12月详细

    创建时间FROM: 创建时间TO:   ExtJS合同管理信息系统源码 2013-12-13   [VS2008] 源码介绍: ExtJS合同管理信息系统源码浏览器兼容:IE,Firefox,谷歌等主 ...

  6. 在ubuntu16.04上编译android源码【转】

    本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...

  7. [Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程

    本文转载自:[Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...

  8. THINKPHP_(8)_修改TP源码,支持基于多层关联的任一字段进行排序

    之前博文 前述博文THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序,其解决的主要问题是,对于查询出的think\collection数据,按指定字段对数据进行排序,从而在页面上进 ...

  9. v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码

    子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...

随机推荐

  1. [C#.NET]

    Control.Refresh - does an Control.Invalidate followed by Control.Update. Refresh: 强制控件使其工作区无效并立即重绘自己 ...

  2. XMLHttpRequest cannot load file:///E:/userdialog.html?_=1465888805734. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-reso

    做前端写静态页面时,采用的是jq easyui框架 在ie与webkit总是加载的时候总是在loading... 而firefox却是正常加载的,总以为是代码写错了, 经过再三的检查以及百度查找,确认 ...

  3. codesmith生成java类

    今天生成的时候的时候找不到类型转换的文件JavaAlias 后台发现我装完codesmith后,没有把类型转换类放入对应的文件 把System-JavaTableNameComments.csmap和 ...

  4. mysql +ibatis

    1.返回插入ID a.xml <insert id="insert" parameterClass="klcQuestion"> insert in ...

  5. JAVA 异常类

    1.Exception(异常) :是程序本身可以处理的异常. 2.Error(错误): 是程序无法处理的错误.这些错误表示故障发生于虚拟机自身.或者发生在虚拟机试图执行应用时,一般不需要程序处理. 3 ...

  6. CentOS 7 系统的初始划配置

    (1).主机名的更改 •临时生效:hostname  主机名 •永久生效:hostnamectl set-hostname 主机名 (2).网络的配置 •临时生效:ifconfig  网卡名 IP地址 ...

  7. CodeForces 742A Arpa’s hard exam and Mehrdad’s naive cheat

    题意:求1378 n次幂的最后一位. 析:两种方法,第一种,就是快速幂,第二种找循环节,也很好找,求一下前几个数就好. 代码如下: #pragma comment(linker, "/STA ...

  8. PHPstudy 无法启动Apache

    今天打安装完phpstudy的时候,启动Apache发现端口被占用,这个端口也就是system端口.如果想要启动服务器必须关掉这个,但是会导致系统无法正常显示. 后来我就在网上搜各种办法,依然没成功. ...

  9. 使用joi来验证数据模型

    我们用nodejs实现一些功能时,往往需要对用户输入的数据进行验证.然而,验证是一件麻烦的事情,很有可能你需要验证数据类型,长度,特定规则等等,在前端做表单验证时,我们常用的做法是使用正则,正则表达式 ...

  10. P1906联合权值

    描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离. ...