最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NumberToUpper數(shù)字轉(zhuǎn)中文詳解

 更新時間:2013年12月16日 09:24:04   作者:  
本文介紹NumberToUpper數(shù)字轉(zhuǎn)中文的方法,大家參考使用吧

使用時需開啟unsafe選項(xiàng)

構(gòu)造函數(shù)有4個參數(shù)

number : 數(shù)字文本

isSimplified : 是否只使用簡體中文,默認(rèn):false

isMoney : 是否是金額模式(忽略小數(shù)點(diǎn)后3位,并加上單位"元,角,分或整"),否認(rèn):true

veryBig : 是否開啟大數(shù)字文本模式(接受15位以上整數(shù),及10位以上小數(shù)),否認(rèn):false

復(fù)制代碼 代碼如下:

using System;
using System.ComponentModel;
using System.Text;
using System.Text.RegularExpressions;

namespace blqw
{
    public static class NumberToUpper
    {
        #region 固定參數(shù)
        //^[-+]?\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 =
        {
            "零壹貳叁肆伍陸柒捌玖點(diǎn)",
            "零一二三四五六七八九點(diǎn)"
        };
        readonly static string[] NumberUnits =
        {
            "仟萬拾佰億負(fù)",
            "千萬十百億負(fù)"
        };
        readonly static string[] MoneyUnits =
        {
            "圓角分",
            "元角分"
        };

        #endregion

        /// <summary> 將數(shù)字文本轉(zhuǎn)換成大寫
        /// </summary>
        /// <param name="number">數(shù)字文本</param>
        /// <param name="isSimplified">是否只使用簡體中文,默認(rèn):否</param>
        /// <param name="isMoney">是否是金額模式(忽略小數(shù)點(diǎn)后3位,并加上單位"元,角,分或整"),否認(rèn):是</param>
        /// <param name="veryBig">是否開啟大數(shù)字文本模式(接受15位以上整數(shù),及10位以上小數(shù)),否認(rèn):否</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不是數(shù)字", "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("不建議轉(zhuǎn)換超過15位的整數(shù),除非將veryBig參數(shù)設(shè)置為true", "number");
                    }
                    if (mdec.Length > 10 && veryBig == false)
                    {
                        throw new ArgumentException("不建議轉(zhuǎn)換超過10位的小,除非將veryBig參數(shù)設(shè)置為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);
                        }
                    }
                }
            }

 

 

        }

        //操作小數(shù)部分
        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();
        }

        //操作整數(shù)部分,為了效率不寫遞歸.....
        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';         //獲得當(dāng)前的數(shù)0-9

                if (num != 0 && ling == true)//需要加 零
                {
                    sb.Append(upnum[0]);
                    ling = false;           //重置 參數(shù)
                }

                if (length % 8 == 1)        //判斷是否在"億"位
                {                           //如果是
                    int n = length / 8;     //計(jì)算應(yīng)該有幾個"億"

                    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;     //重置 參數(shù)
                        yi = false;                 //重置 參數(shù)
                        if (wan) wan = false;       //重置 參數(shù)
                    }
                }
                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; //重置 參數(shù)
                            wan = false;            //重置 參數(shù)
                            if (!yi) yi = true;     //設(shè)定 參數(shù)
                        }
                    }
                    else                            //十千百
                    {
                        if (num != 0)               //如果不為 0
                        {
                            if ((uIndex == 2 && num == 1) == false) //排除 "一十二" 只顯示 "十二"
                            {
                                sb.Append(upnum[num]);  //加入字符串
                            }
                            sb.Append(numut[uIndex]);//加入單位
                            if (!yi) yi = true;     //設(shè)定 參數(shù)
                            if (!wan) wan = true;   //設(shè)定 參數(shù)
                        }
                        else if (ling == false)
                        {
                            ling = true;
                        }
                    }
                }

                length--;
                p++;
            }
            return sb.ToString();
        }

    }
}

復(fù)制代碼 代碼如下:

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);


相關(guān)文章

  • C#讀取Excel并轉(zhuǎn)化成XML的方法

    C#讀取Excel并轉(zhuǎn)化成XML的方法

    這篇文章主要介紹了C#讀取Excel并轉(zhuǎn)化成XML的方法,實(shí)例分析了C#操作Excel及XML文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#中的delegate委托類型基本學(xué)習(xí)教程

    C#中的delegate委托類型基本學(xué)習(xí)教程

    這篇文章主要介紹了C#中的delegate委托類型基本學(xué)習(xí)教程,委托是C#語言所具有的一個重要特性,需要的朋友可以參考下
    2016-01-01
  • C#對XmlHelper幫助類操作Xml文檔的通用方法匯總

    C#對XmlHelper幫助類操作Xml文檔的通用方法匯總

    該篇文章主要總結(jié)的是自己平時工作中使用頻率比較高的Xml文檔操作的一些常用方法和收集網(wǎng)上寫的比較好的一些通用Xml文檔操作的方法,對C#?XmlHelper幫助類操作Xml文檔相關(guān)知識感興趣的朋友一起看看吧
    2022-03-03
  • C#連接SQLite數(shù)據(jù)庫并實(shí)現(xiàn)基本操作

    C#連接SQLite數(shù)據(jù)庫并實(shí)現(xiàn)基本操作

    本文介紹了SQLite,一個輕量級的跨平臺數(shù)據(jù)庫管理系統(tǒng),以及如何在C#中使用System.Data.SQLite庫進(jìn)行操作,包括創(chuàng)建、修改和查詢數(shù)據(jù)庫,以及使用SQLiteHelper類簡化SQL使用,此外,還提到了DB文件查看工具SQLiteSpy的應(yīng)用,需要的朋友可以參考下
    2024-12-12
  • C#并發(fā)編程之Task類詳解

    C#并發(fā)編程之Task類詳解

    Task是建立在線程池之上的一種多線程技術(shù),它的出現(xiàn)使Thread成為歷史。其使用方法非常簡單,本文就來通過幾個示例為大家講講它的具體使用吧
    2023-03-03
  • Unity3D使用陀螺儀控制節(jié)點(diǎn)旋轉(zhuǎn)

    Unity3D使用陀螺儀控制節(jié)點(diǎn)旋轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了Unity3D使用陀螺儀控制節(jié)點(diǎn)旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C#中枚舉的特性 FlagAttribute詳解

    C#中枚舉的特性 FlagAttribute詳解

    說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據(jù)航班政策來返回哪些配送方式是否可用,根據(jù)這些是否可用來隱藏或者開啟界面的相關(guān)配送方式,不是非常明白,于是今天我們就來詳細(xì)探討下這個問題
    2018-03-03
  • 使用C#實(shí)現(xiàn)MD5加密的方法詳解

    使用C#實(shí)現(xiàn)MD5加密的方法詳解

    在軟件開發(fā)中,加密是保護(hù)數(shù)據(jù)安全的重要手段之一,MD5(Message Digest Algorithm 5)是一種常用的哈希算法,用于生成數(shù)據(jù)的摘要或哈希值,本文介紹了如何使用C#語言實(shí)現(xiàn)MD5加密的方法,涵蓋了基本的使用方式和擴(kuò)展方法封裝,需要的朋友可以參考下
    2024-08-08
  • DevExpress設(shè)置餅狀圖的Lable位置實(shí)例

    DevExpress設(shè)置餅狀圖的Lable位置實(shí)例

    這篇文章主要介紹了DevExpress設(shè)置餅狀圖的Lable位置的方法,以實(shí)例形式詳細(xì)講述了設(shè)置餅狀圖的Lable位置具體實(shí)現(xiàn)過程,需要的朋友可以參考下
    2014-10-10
  • C#/VB.NET?實(shí)現(xiàn)彩色PDF轉(zhuǎn)為灰度PDF

    C#/VB.NET?實(shí)現(xiàn)彩色PDF轉(zhuǎn)為灰度PDF

    本文以C#代碼為例介紹如何實(shí)現(xiàn)將彩色PDF文件轉(zhuǎn)為灰度(黑白)的PDF文件,即將PDF文檔里面的彩色圖片或者文字等通過調(diào)用方法轉(zhuǎn)為文檔頁面為灰色調(diào)、無彩色效果的文檔??靵砀S小編一起學(xué)習(xí)吧
    2021-11-11

最新評論

沈阳市| 腾冲县| 孝昌县| 镇坪县| 灌南县| 罗山县| 丹凤县| 曲靖市| 津市市| 甘泉县| 浦县| 黄浦区| 东乡县| 石泉县| 历史| 上林县| 康平县| 株洲县| 丰镇市| 巫溪县| 英超| 鹰潭市| 乐都县| 兴宁市| 吐鲁番市| 北宁市| 芷江| 湘乡市| 衡山县| 定州市| 平邑县| 孟津县| 万安县| 运城市| 教育| 大厂| 搜索| 江门市| 金寨县| 大洼县| 沙河市|