Re: [閒聊] 中文數字轉阿拉伯數字

作者: poewar (☺☻)   2021-11-18 17:06:33
因為在弄ansi繪圖軟體
所以這邊也提供一個嘗試用類似的處理方式來轉換文字
由左往右逐個char處理,並以萬、億、兆等來結算區塊
public ulong GetValue(string s)
{
ulong totalValue = 0;
ulong blockValue = 0;
ulong cellValue = 0;
for (int i = 0; i < s.Length; i++)
{
char c = s[i];
var checkout = Checkout(c); //看是否結算區塊
if (checkout.Item1)
{
totalValue += (blockValue + cellValue) * checkout.Item2;
blockValue = 0;
cellValue = 0;
continue;
}
var v = Conv(c);
if (v.Item1)
{
cellValue = v.Item2;
}
else
{
blockValue += (cellValue == 0) ? 1 * v.Item2
: cellValue * v.Item2;
cellValue = 0;
}
}
totalValue += blockValue + cellValue;
return totalValue;
}
//轉換判斷
public (bool, ulong) Conv(char c) => c switch
{
'零' => (true, 0),
'一' => (true, 1),
'二' => (true, 2),
'兩' => (true, 2),
'三' => (true, 3),
'四' => (true, 4),
'五' => (true, 5),
'六' => (true, 6),
'七' => (true, 7),
'八' => (true, 8),
'九' => (true, 9),
'十' => (false, 10),
'百' => (false, 100),
'千' => (false, 1000),
_ => (false, 1),
};
//結算判斷
public (bool, ulong) Checkout(char c) => c switch
{
'萬' => (true, 10000),
'億' => (true, 100000000),
'兆' => (true, 1000000000000),
'京' => (true, 10000000000000000),
_ => (false, 1),
};
//Test cases
//string cNum = "一億兩千五百五十萬三千三百三十三"; // 125503333 pass
//string cNum = "一億兩千零五萬三百零三"; // 120050303 pass
//string cNum = "十五億零八萬一千二百零五"; //1500081205 pass
//string cNum = "兩億"; // 200000000 pass
//string cNum = "三億零二十六"; // 300000026 pass
//string cNum = "三億十六"; // 300000016 pass
//string cNum = "三億零十六"; // 300000016 pass
//string cNum = "百萬"; // 1000000 pass
//string cNum = "百八十"; // 180 pass
//string cNum = "千萬";
// 10000000 pass (Elapsed = {00:00:00.0006638})
//string cNum = "五億五百萬五百";
// 505000500 pass (Elapsed = {00:00:00.0007338})
//string cNum = "一千八百四十四京六千七百四十四兆
零七百三十七億零九百五十五萬一千六百一十五";
//18,446,744,073,709,551,615 pass (Elapsed = {00:00:00.0008699})
兩個字跟37個字基本上沒差太多
不確定有沒有小問題,不過大致上應該可以用
如果要判斷負的話就改一下單位,開頭多判斷個'負'就好
作者: tsetsethatha (吉星麥造~~~我來了)   2021-11-18 19:22:00
感謝分享

Links booklink

Contact Us: admin [ a t ] ucptt.com