人民币大写金额转换C#方法
方法的代码如下:
/// <summary>
/// 人民币大写
/// </summary>
/// <param name="input">待转换输入</param>
/// <param name="prefix">需要添加人民币前缀</param>
/// <exception cref="ArgumentException" />
/// <returns>转换后的结果</returns>
public static string ToCapital(this string input, bool prefix = false) { #region Step1 输入有效性验证 if (!Regex.IsMatch(input, @"(?<=-|^)\d*\.?\d*$"))
throw new ArgumentException("错误的输入金额!"); if (Regex.IsMatch(input, @"^\d{25,}"))
throw new ArgumentException("输入数据太大无法转换!"); #endregion #region Step2 格式化为中间字符串 var positionDic = new Dictionary<int, string> {
{,"F"},{,"J"},{,"."},{,"S"},{,"B"},{,"Q"},{,"W"},{,"SW"},{,"BW"},{,"QW"},
{,"Y"},{,"SY"},{,"BY"},{,"QY"},{,"WY"},{,"SWY"},{,"BWY"},{,"QWY"},{,"YY"},
{,"SYY"},{,"BYY"},{,"QYY"},{,"WYY"},{,"SWYY"},{,"BWYY"},{,"QWYY"}
}; input = Regex.Replace(input, @"^\.", "0."); var integerPart = Regex.Replace(input, @"^-|\..*$", "");
var _matchDecimal = Regex.Match(input, @"\.\d*$", RegexOptions.None);
var decimalPart = Regex.Replace(_matchDecimal.Success ? Convert.ToDouble(_matchDecimal.Value).ToString("0.00") : "", @"0\.", ""); var processStack = new Stack<string>();
var charsArray = (integerPart + decimalPart).Reverse<char>();
for (int i = ; i < charsArray.Count(); i++) {
processStack.Push(string.Format("{0}{1}", charsArray.ElementAt(i), positionDic[i]));
} //符号处理 keleyi.com
if (Regex.IsMatch(input, "^-", RegexOptions.None)) {
processStack.Push("-");
}
if (prefix) {
processStack.Push("¥");
} var process = string.Empty;
while (processStack.Count > ) {
process += processStack.Pop();
}
//语义处理模式队列
Queue<Tuple<string, string, MatchEvaluator>> patterns = new Queue<Tuple<string, string, MatchEvaluator>>();
var patternBuilder = new StringBuilder();
for (int i = ; i < positionDic.Count; i++) {
patternBuilder.AppendFormat("{0}{1}", (i == ? "(0(?:" : "") + positionDic[i], i == positionDic.Count - ? ")+?)+" : "|");
}
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(patternBuilder.ToString(), "", null));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"(?:\d+(?:QW|BW|SW|W|Q|B|S)?\d?YY)+", null, m => m.Value.Replace("YY", "") + "YY"));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"(?:\d+(?:QW|BW|SW|W|Q|B|S)?\d?Y)+", null, m => m.Value.Replace("Y", "") + "Y"));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"(?:\d+(?:Q|B|S)?\d?W)+", null, m => m.Value.Replace("W", "") + "W"));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"(?!^)0+\.", ".", null));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"^0\.0J|^0\.", "", null));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>("0J|0F", "", null));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>("J0?$", "JZ", null));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"\.$|\.0+$", ".Z", null));
patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"^0+$|^[^.]{0}$", "0.Z", null)); while (patterns.Count > ) {
var pattern = patterns.Dequeue();
if (pattern.Item3 != null) {
process = Regex.Replace(process, pattern.Item1, pattern.Item3);
}
else {
process = Regex.Replace(process, pattern.Item1, pattern.Item2);
}
} #endregion #region Step3 翻译中间字符串
StringBuilder result = new StringBuilder();
var translatorDic = new Dictionary<char, string> {
{'',"零"},{'',"壹"},{'',"贰"},{'',"叁"},{'',"肆"},{'',"伍"},{'',"陆"},{'',"柒"},{'',"捌"},{'',"玖"},
{'S',"拾"},{'B',"佰"},{'Q',"仟"},{'W',"萬"},{'Y',"亿"},
{'¥',"人民币"},{'-',"负"},{'.',"圆"},{'J',"角"},{'F',"分"},{'Z',"整"}
};
for (int i = ; i < process.Length; i++) {
result.Append(translatorDic[process[i]]);
}
#endregion return result.ToString();
}
http://www.cnblogs.com/roucheng/
一个人民币大写的扩展方法。感觉还是有点复杂,请朋友们帮忙优化下或是给个思路。
人民币大写金额转换C#方法的更多相关文章
- C# 人民币大写金额转换
/// <summary> /// 转换人民币大小金额 /// </summary> /// <param name="nu ...
- FastReport调用Delphi中的自定义函数(人民币大写金额)mtm
1. 在 FormCreate 中向FastReprot添加函数 (fPrint)窗口 procedure TfPrint.FormCreate(Sender: TObject); frxReport ...
- C#转换人民币大写金额
/// <summary> /// 转换人民币大写金额. /// </summary> public class RMBConverter { /// <summary& ...
- FastReport调用Delphi中的人民币大写转换自定义函数
FastReport调用Delphi中的人民币大写转换自定义函数 FastReport调用Delphi中的人民币大写转换自定义函数 function TJzpzEdit1.MoneyCn(mmje ...
- Excel 数值转换为人民币大写金额字符串
把$B$27单元格中的数值转换为人民币大写金额字符串: 目标单元格填入以下公式: =IF($B$27=0,CONCATENATE(IF($B$27<=0,,TEXT(INT($B$27),&qu ...
- 微信录音文件上传到服务器以及amr转化成MP3格式,linux上转换简单方法
微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...
- C#中二进制、十进制和十六进制互相转换的方法
二进制在C#中无法直接表示,我们一般用0和1的字符串来表示一个数的二进制形式.比如4的二进制为"100".下面介绍C#里面用于进制转换的方法. 十进制转换为二进制(int--> ...
- jquery对象与dom对象之间互相转换的方法
本文主要讲述jquery对象和js里的dom对象之间互相转换的方法,使jquery对象可以直接使用js里的方法,或js里的dom对象使用jquery里的方法. jquery对象和dom对象是不一样的, ...
- 托管和非托管转换新方法:Marshaling Library(zz) 【转】
托管和非托管转换新方法:Marshaling Library(zz) 托管和非托管转换新方法:Marshaling Library(zz) http://hi.baidu.com/superql/bl ...
随机推荐
- 【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?
本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...
- Asp.net Core WebApi 使用Swagger做帮助文档,并且自定义Swagger的UI
WebApi写好之后,在线帮助文档以及能够在线调试的工具是专业化的表现,而Swagger毫无疑问是做Docs的最佳工具,自动生成每个Controller的接口说明,自动将参数解析成json,并且能够在 ...
- SQL的主键和外键约束
SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...
- Android手机的 storage
老外的一段解释 -------------------------------------------------------------------------------------------- ...
- Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object
本地原来已经安装了JAVA JDK1.7并配置好了环境变量; 然后又安装了JDK8,想2个版本并存. 然后发现eclipse 打不开,闪退.然后查看环境: 发现 C:\Users\Administra ...
- Maven3路程(三)用Maven创建第一个web项目(2)servlet演示
上一章用Maven新建了web项目成功后,本文演示在此基础上应用servlet. 1.首先修改pom.xml文件,添加servlet依赖 <project xmlns="http:// ...
- 关于Android真机调测Profiler
U3D中的Profile也是可以直接在链接安卓设备运行游戏下查看的,导出真机链接U3D的Profile看数据,这样能更好的测试具体原因. 大概看了下官方的做法,看了几张帖子顺带把做法记录下来. ...
- python-根据左右值获取城市区域编码
def get_adcode(city): """ 根据城市获取区域编码 :param city: :return: """ db = db ...
- mem_fun 例子
// functional_mem_fun.cpp // compile with: /EHsc #include <vector> #include <functional> ...
- Adobe flash player更新失败