• [源码]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	]*0*(?<integer>[-+]?d*)[.]?(?<decimal>d*[1-9])?[0]*[s	]*$", 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(' ', '	');    //去掉多余的空格,制表符
                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);

  • 相关阅读:
    如何用阿里云ECS搭建网站
    win10下使用pipreqs提示不是内部或外部命令
    python使用openpyxl获取合并单元格的值
    Chrome的一些常用小tips
    Ubantu部署
    分不清ERP、SAP、MES?干货整理看这里
    ApacheCN 数据科学译文集 20210313 更新
    ApacheCN 计算机视觉译文集 20210218 更新
    ApacheCN 计算机视觉译文集 20210212 更新
    ApacheCN 计算机视觉译文集 20210203 更新
  • 原文地址:https://www.cnblogs.com/blqw/p/NumberToUpper.html
Copyright © 2020-2023  润新知