NumberToUpper數(shù)字轉(zhuǎn)中文詳解
使用時需開啟unsafe選項
構(gòu)造函數(shù)有4個參數(shù)
number : 數(shù)字文本
isSimplified : 是否只使用簡體中文,默認:false
isMoney : 是否是金額模式(忽略小數(shù)點后3位,并加上單位"元,角,分或整"),否認:true
veryBig : 是否開啟大數(shù)字文本模式(接受15位以上整數(shù),及10位以上小數(shù)),否認:false
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 =
{
"零壹貳叁肆伍陸柒捌玖點",
"零一二三四五六七八九點"
};
readonly static string[] NumberUnits =
{
"仟萬拾佰億負",
"千萬十百億負"
};
readonly static string[] MoneyUnits =
{
"圓角分",
"元角分"
};
#endregion
/// <summary> 將數(shù)字文本轉(zhuǎn)換成大寫
/// </summary>
/// <param name="number">數(shù)字文本</param>
/// <param name="isSimplified">是否只使用簡體中文,默認:否</param>
/// <param name="isMoney">是否是金額模式(忽略小數(shù)點后3位,并加上單位"元,角,分或整"),否認:是</param>
/// <param name="veryBig">是否開啟大數(shù)字文本模式(接受15位以上整數(shù),及10位以上小數(shù)),否認:否</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'; //獲得當前的數(shù)0-9
if (num != 0 && ling == true)//需要加 零
{
sb.Append(upnum[0]);
ling = false; //重置 參數(shù)
}
if (length % 8 == 1) //判斷是否在"億"位
{ //如果是
int n = length / 8; //計算應(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();
}
}
}
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#具名參數(shù)(Named Parameters)的使用
在C#中,具名參數(shù)是一種在方法調(diào)用中使用參數(shù)名稱來指定參數(shù)值的技術(shù),本文主要介紹了C#具名參數(shù)的使用,具有一定的參考價值,感興趣的可以了解一下2024-01-01UnityShader3實現(xiàn)轉(zhuǎn)圈與冷卻效果
這篇文章主要為大家詳細介紹了UnityShader3實現(xiàn)轉(zhuǎn)圈與冷卻效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03