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> {
        {0,"F"},{1,"J"},{2,"."},{3,"S"},{4,"B"},{5,"Q"},{6,"W"},{7,"SW"},{8,"BW"},{9,"QW"},
        {10,"Y"},{11,"SY"},{12,"BY"},{13,"QY"},{14,"WY"},{15,"SWY"},{16,"BWY"},{17,"QWY"},{18,"YY"},
        {19,"SYY"},{20,"BYY"},{21,"QYY"},{22,"WYY"},{23,"SWYY"},{24,"BWYY"},{25,"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") : "00", @"0\.", "");

var processStack = new Stack<string>();
    var charsArray = (integerPart + decimalPart).Reverse<char>();
    for (int i = 0; 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 > 0) {
        process += processStack.Pop();
    }
    //语义处理模式队列
    Queue<Tuple<string, string, MatchEvaluator>> patterns = new Queue<Tuple<string, string, MatchEvaluator>>();
    var patternBuilder = new StringBuilder();
    for (int i = 3; i < positionDic.Count; i++) {
        patternBuilder.AppendFormat("{0}{1}", (i == 3 ? "(0(?:" : "") + positionDic[i], i == positionDic.Count - 1 ? ")+?)+" : "|");
    }
    patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(patternBuilder.ToString(), "0", 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", "0", 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 > 0) {
        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> {
        {'0',"零"},{'1',"壹"},{'2',"贰"},{'3',"叁"},{'4',"肆"},{'5',"伍"},{'6',"陆"},{'7',"柒"},{'8',"捌"},{'9',"玖"},
        {'S',"拾"},{'B',"佰"},{'Q',"仟"},{'W',"萬"},{'Y',"亿"},
        {'¥',"人民币"},{'-',"负"},{'.',"圆"},{'J',"角"},{'F',"分"},{'Z',"整"}
    };
    for (int i = 0; i < process.Length; i++) {
        result.Append(translatorDic[process[i]]);
    }
    #endregion

return result.ToString();
}

(0)

相关推荐

  • C#把数字转换成大写金额的代码实例

    实现代码: 复制代码 代码如下: // 例如:(new Money(200)).ToString() == "贰佰元"namespace Skyiv.Util {    using System.Text;    class Test {        static void Main() {            for (;;) {                System.Console.Write("金额: ");                strin

  • C# 大小写转换(金额)实例代码

    Class:EcanRMB.cs 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Jxc.WinClient.BLL {     public class EcanRMB     {         /// <summary>         /// 转换人民币大小金额         /// </summary>  

  • C#实现将商品金额小写转换成大写的方法

    本文实例讲述了C#实现将商品金额小写转换成大写的方法.分享给大家供大家参考,具体如下: #region [将商品金额小写转换成大写]MoneySmallToBig /// <summary> /// 将商品金额小写转换成大写 /// </summary> /// <param name="par">小写金额</param> /// <returns>处理后的大写金额</returns> public static

  • C#实现将浮点数表示的货币数量以汉字大写形式输出的方法

    本文实例讲述了C#实现将浮点数表示的货币数量以汉字大写形式输出的方法.分享给大家供大家参考.具体如下: 1.函数代码 注:本段代码中能转化的最大的数为(1亿亿-0.01),如果要转化更大的浮点数,则需要做适当修改. /// <summary> /// 将字符型变量转化为大写汉语数字 /// </summary> /// <param name="ch">字符 '0'~'9'</param> /// <returns></

  • C#实现将汉字转化为2位大写的16进制Unicode的方法

    本文实例讲述了C#实现将汉字转化为2位大写的16进制Unicode的方法.分享给大家供大家参考.具体实现方法如下: 说明: str.ToString("x") : 转为1位16进制小写 str.ToString("X") : 转为1位16进制大写 str.ToString("X2"):转为2位16进制大写 具体代码如下: 复制代码 代码如下: publicstaticstring StringToUnicode16(string text, st

  • C#使用正则表达式实现首字母转大写的方法

    本文实例讲述了C#使用正则表达式实现首字母转大写的方法.分享给大家供大家参考,具体如下: class Program { static void Main(string[] args) { // Input strings. const string s1 = "samuel allen"; const string s2 = "dot net perls"; const string s3 = "Uppercase first letters of al

  • C#中利用正则表达式将人民币金额转换为大写汉字

    直接来看代码: public static string ConvertToChineseMoney(double money) { if (money < 0) throw new ArgumentOutOfRangeException("参数money不能为负值!"); string s = money.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A"); s

  • C#找出字符串中第一个字母并大写的方法

    本文实例讲述了C#找出字符串中第一个字母并大写的方法.分享给大家供大家参考,具体如下: class Program { static void Main(string[] args) { String aa = "%.,46,2xb1bfs.,,"; int pos = isLetter(aa); aa = aa.Substring(pos, 1); Console.WriteLine(aa.ToUpper()); Console.Read(); } public static int

  • 使用C#实现阿拉伯数字到大写中文的转换

    先记下来,以备后用! /// <summary> /// 金额转为大写金额 /// </summary> public class MoneyConvertChinese { /// <summary> /// 金额转为大写金额 /// </summary> /// <param name="LowerMoney"></param> /// <returns></returns> publi

  • C#实现人民币大写转换示例代码

    复制代码 代码如下: /// <summary>/// 人民币大写/// </summary>/// <param name="input">待转换输入</param>/// <param name="prefix">需要添加人民币前缀</param>/// <exception cref="ArgumentException" />/// <returns

  • python实现人民币大写转换

    本文实例为大家分享了python实现人民币大写转换的具体代码,供大家参考,具体内容如下 #!/usr/bin/python # -*- coding:utf-8 -*- # ********* 转换方法介绍 ********* # 将需要转换的数字从右向左,每4位分成一个section,如:24530467103,将该数字拆分后,得到: # 245 3046 7103 (245亿3046万7103) # 对拆分后的数字先按照section进行数字到汉字的转换,然后添加数值单位,如:仟,佰,拾,处

  • 数字金额大写转换器制作代码分享(人民币大写转换)

    复制代码 代码如下: /// <summary>/// 人民币大写/// </summary>/// <param name="input">待转换输入</param>/// <param name="prefix">需要添加人民币前缀</param>/// <exception cref="ArgumentException" />/// <returns

  • .NET core高性能对象转换示例代码

    前言 NET Core(开放源代码,跨平台,x-copy可部署等)有许多令人兴奋的方面,其中最值得称赞的就是其性能了.关于对象转换已经有不少轮子(AutoMapper,TinyMapper) .出于项目需要,手动造一个简单轮子.下面话不多说了,来一起看看详细的介绍吧. 示例代码 g>1.采用静态泛型类缓存,避免了拆箱装箱操作. 2.对于转换对象中有,字段名一样但是类型不一样的类时仍可以用 public static class Mapper<TSource, TTarget> where

  • JS实现将人民币金额转换为大写的示例代码

    复制代码 代码如下: //人民币金额转大写程序 JavaScript版     //CopyRight Bardo QI function numToCny(num){         var capUnit = ['万','亿','万','圆',''];         var capDigit = { 2:['角','分',''], 4:['仟','佰','拾','']};         var capNum=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'

  • ASP.NET JSON字符串与实体类的互转换示例代码

    还是先封装一个类吧! 这个类网上都可以找到的!有个这个类,一切都将变得简单了,哈哈. 复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization.Json;using System.ServiceModel.Web;///记得引用这个命名空间using System.IO;using System.Tex

  • java中字符进行全角半角转换示例代码

    前言 本文将给大家展示一下如何将char进行半角与全角转换,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 术语 全角 SBC case Sexagesimal to Binary Converter 60进制转为2进制 半角 DBC case Decimal to Binary Converter 10进制转为2进制 工具类 public class AsciiUtil { public static final char SBC_SPACE = 12288; // 全角空格

  • php阿拉伯数字转中文人民币大写

    本文实例为大家分享了php阿拉伯数字转中文人民币大写的实现代码,供大家参考,具体代码如下 代码1:php阿拉伯数字转中文人民币大写,有详细的注释 /** *数字金额转换成中文大写金额的函数 *String Int $num 要转换的小写数字或小写字符串 *return 大写字母 *小数位为两位 **/ function num_to_rmb($num){ $c1 = "零壹贰叁肆伍陆柒捌玖"; $c2 = "分角元拾佰仟万拾佰仟亿"; //精确到分后面就不要了,所以

  • PHP 实现人民币小写转换成大写的方法及大小写转换函数

    下面一段代码给大家分享php实现人民币大小写转换的方法,具体代码如下所示: <?php header("charset=utf-8;"); function numTrmb($num){ $d = array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", &q

  • Java实现驼峰和下划线互相转换的示例代码

    目录 前言 1.驼峰与下划线互转 2.测试 3.方法补充 前言 基本语法 首先我们要知道java的基础语法. 1.由26个英文字母大小写,0-9,_或$组成 2.数字不可以开头 3.不可以使用关键字和保留字,但是能包括关键字和保留字 4.Java中严格区分大小写,长度无限制 5.标识符不能包括空格 6.取名尽量做到“见名知意” 驼峰命名法 骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程式编写时的一套命名规则(惯例). 正如它的名称CamelCase所表示的那样,是指混合使用大小写

随机推荐