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

[源码]NumberToUpper 数字转中文的更多相关文章
- jmeter 源码修改返回值中文Unicode编码问题
修改jmeter源码,可能会对其他格式的responseData有一定影响,图片或者其他 在 ListenerNotifier 类中找到 notifyListeners 方法,在其下面添加如下代码: ...
- THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序。
问题:TP从服务器数据中取出的collection数据,当进一步在网页中进行分页显示时,需要调用order函数,实现类似如下图的排序. 当点击页面中的相关内容时,实现对服务器数据进行重排,就要调用TP ...
- vscode源码编译运行打包使其由英文变为中文
vscode默认是英文,如果你想让其变为中文,可参考这个链接:https://blog.csdn.net/testcs_dn/article/details/75070415 最近发现一个很奇怪的问题 ...
- GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)
以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...
- 16Aspx.com源码2013年10月到2013年12月详细
创建时间FROM: 创建时间TO: ExtJS合同管理信息系统源码 2013-12-13 [VS2008] 源码介绍: ExtJS合同管理信息系统源码浏览器兼容:IE,Firefox,谷歌等主 ...
- 在ubuntu16.04上编译android源码【转】
本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...
- [Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程
本文转载自:[Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...
- THINKPHP_(8)_修改TP源码,支持基于多层关联的任一字段进行排序
之前博文 前述博文THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序,其解决的主要问题是,对于查询出的think\collection数据,按指定字段对数据进行排序,从而在页面上进 ...
- v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码
子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...
随机推荐
- Groovy 转换JSON和生产JSON
Groovy 类和JSON之间的相互转换,主要在groovy.json包下面 1. JsonSlurper JsonSlurper 这个类用于转换JSON文本或从Groovy 数据结构中读取内容例如m ...
- firefox的console log功能
http://www.ruanyifeng.com/blog/2011/03/firebug_console_tutorial.html Firebug是网页开发的利器,能够极大地提升工作效率. 但是 ...
- window.innerWidth、document.body.clientWidth和html的大小的区别
首先,我们知道document.body指向的就是body元素,如此,我们就可以以document.body来获取body的大小.何以知之?如下代码: var body = document.quer ...
- android技巧总结
技巧1. 在写布局文件时,有时不需要给控件指定text值,但是又想知道他的位置是否是自己想要他在的位置.这种情况只有在运行时给他指定text值才能确切地知道它显示的位置. 现在有一种方法可以实现,即利 ...
- ArcGIS10.1 api for Flex开发用于ArcGIS 9.3时QueryTask 'Error #2032'错误的解决方案
因客户GIS软件需求,将应用降级到低版本ArcGIS9.3,不仅数据有些样式.配色.字符有些问题,API也要相应“降级”,解决如下: 利用9.3+flex做QueryTask时候出现了[RPC Fau ...
- http协议与网页优化泛谈
最近公司开展职业技能培训,本人招录了部分内容写成博客,若有纰漏,欢迎拍砖. http简述: http又称超文本传输协议,是一种无状态&无记忆协议的运用层协议,处于tcp传输层协议之上,采用请求 ...
- 关于"Command /usr/bin/codesign failed with exit code 1"的解决办法
今天当码农的时候,xcode爆出"Command /usr/bin/codesign failed with exit code 1"这样一个错 当时以为是授权文件设置不正确的问题 ...
- 使用.net Reflector手动修改单个dll文件
在项目中修改bug会存才版本混乱的问题,加上dll中的依赖项目比较多,想要修改单个dll文件中的少量代码是很麻烦的. 可以使用Reflector和Reflexil可以手动修改单个dll文件,我使用的是 ...
- web前端防治重复提交
web前端开发中防治重复提交 web前端数据请求或者表单提交往往通过对dom的点击事件来操作,但是往往因为认为点击过快(少年手速挺快的嘛),或者因为响应等待使得用户误人为没操作而重复很多次点击,造成表 ...
- C# XMAL与WPF
通过老师上课的解释和我下课后的网上查询,我了解到了一些关于这三者的关系.XAML是.NET体系开发程序或者网页时前台编程的一种布局方式或者说开发语言,可以比较自由的用标签的方式进行布局,借鉴了HTML ...