我有一個字符串,其中包含非ascii格式的數字,例如unicode BENGALI DIGIT ONE(U + 09E7):"১"
在.NET中解析一個非ascii(unicode)數字串作爲整數
如何在.NET中將其解析爲整數?
注意:我試過使用int.Parse()
指定一個帶有「bn-BD」的孟加拉文化格式作爲IFormatProvider。不起作用。
我有一個字符串,其中包含非ascii格式的數字,例如unicode BENGALI DIGIT ONE(U + 09E7):"১"
在.NET中解析一個非ascii(unicode)數字串作爲整數
如何在.NET中將其解析爲整數?
注意:我試過使用int.Parse()
指定一個帶有「bn-BD」的孟加拉文化格式作爲IFormatProvider。不起作用。
您可以創建一個與舊字符串相同的新字符串,但將本機數字替換爲拉丁十進制數字。這可以通過遍歷字符並檢查char.IsDigit(char)
的值來可靠地完成。如果此函數返回true,則將其轉換爲char.GetNumericValue(char).ToString()
。
像這樣:
static class DigitHelper
{
public static string ConvertNativeDigits(this string text)
{
if (text == null)
return null;
if (text.Length == 0)
return string.Empty;
StringBuilder sb = new StringBuilder();
foreach (char character in text)
{
if (char.IsDigit(character))
sb.Append(char.GetNumericValue(character));
else
sb.Append(character);
}
return sb.ToString();
}
}
int value = int.Parse(bengaliNumber.ConvertNativeDigits());
它看起來像這樣是not possible使用內置的功能:
了.NET Framework解析作爲小數是ASCII數字0至9,由碼指定的唯一的Unicode數字值通過U + 0030 ü+ 0039。
...
解析爲全角數字,阿拉伯語,印度語數字,並孟加拉語數字失敗,並拋出一個異常的Unicode代碼值的嘗試。
(重點煤礦)
很奇怪的是CultureInfo("bn-BD").NumberFormat.NativeDigits
不包含它們。
是啊,我看到:最差的題爲之一, MSDN上最無意義的文章,對吧?看起來像是某個人寫一個輔助方法的好機會,並且爲它收取美元:D – 2011-05-26 15:57:57
@ʞɔɐɯɹoↃɔWsǝɯɐs - 是的。儘管從'NativeDigits'返回的數組看起來是正確的(我認爲......不讀孟加拉語),但快速幫手不應太難:) – Oded 2011-05-26 16:01:38
已經發現了這個問題,同時尋找一個類似的答案,但沒有發現任何相當匹配,我需要什麼樣的答案,我寫的,因爲它將跡象好以下,並且是如果給出非常長的字符串,則更快失敗。它不但是,忽略任何分組字符,如,
,'
,’
,不過這可能會讓如果有人想很容易的添加(我沒有):
public static int ParseIntInternational(this string str)
{
int result = 0;
bool neg = false;
bool seekingSign = true; // Accept sign at beginning only.
bool done = false; // Accept whitespace at beginning end or between sign and number.
// If we see whitespace once we've seen a number, we're "done" and
// further digits should fail.
for(int i = 0; i != str.Length; ++i)
{
if(char.IsWhiteSpace(str, i))
{
if(!seekingSign)
done = true;
}
else if(char.IsDigit(str, i))
{
if(done)
throw new FormatException();
seekingSign = false;
result = checked(result * 10 + (int)char.GetNumericValue(str, i));
}
else if(seekingSign)
switch(str[i])
{
case '﬩': case '+':
//do nothing: Sign unchanged.
break;
case '-': case '−':
neg = !neg;
break;
default:
throw new FormatException();
}
else throw new FormatException();
}
if(seekingSign)
throw new FormatException();
return neg ? -result : result;
}
不要忘記,在許多這些文化中它們將被格式化爲從右到左;) – 2011-05-26 16:07:37
@ʞɔɐɯɹoↃɔWsǝɯɐs - RTL不應該成爲一個問題,因爲Unicode將正確的(邏輯)數字序列定義爲對所有腳本最重要或最不重要。這在§2.5(p.15)中的Unicode標準6.0中有描述。 – 2011-05-26 16:09:50
請注意,您仍然希望使用正確的文化來進行數字轉換,因爲我對小數,分組,貨幣和符號字符有所不同。 – 2011-05-26 16:26:01