2011-05-26 22 views

回答

5

您可以創建一個與舊字符串相同的新字符串,但將本機數字替換爲拉丁十進制數字。這可以通過遍歷字符並檢查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()); 
+0

不要忘記,在許多這些文化中它們將被格式化爲從右到左;) – 2011-05-26 16:07:37

+0

@ʞɔɐɯɹoↃɔWsǝɯɐs - RTL不應該成爲一個問題,因爲Unicode將正確的(邏輯)數字序列定義爲對所有腳本最重要或最不重要。這在§2.5(p.15)中的Unicode標準6.0中有描述。 – 2011-05-26 16:09:50

+0

請注意,您仍然希望使用正確的文化來進行數字轉換,因爲我對小數,分組,貨幣和符號字符有所不同。 – 2011-05-26 16:26:01

3

它看起來像這樣是not possible使用內置的功能:

了.NET Framework解析作爲小數是ASCII數字0至9,由碼指定的唯一的Unicode數字值通過U + 0030 ü+ 0039。

...

解析爲全角數字,阿拉伯語,印度語數字,並孟加拉語數字失敗,並拋出一個異常的Unicode代碼值的嘗試。

(重點煤礦)

很奇怪的是CultureInfo("bn-BD").NumberFormat.NativeDigits不包含它們。

+0

是啊,我看到:最差的題爲之一, MSDN上最無意義的文章,對吧?看起來像是某個人寫一個輔助方法的好機會,並且爲它收取美元:D – 2011-05-26 15:57:57

+0

@ʞɔɐɯɹoↃɔWsǝɯɐs - 是的。儘管從'NativeDigits'返回的數組看起來是正確的(我認爲......不讀孟加拉語),但快速幫手不應太難:) – Oded 2011-05-26 16:01:38

0

已經發現了這個問題,同時尋找一個類似的答案,但沒有發現任何相當匹配,我需要什麼樣的答案,我寫的,因爲它將跡象好以下,並且是如果給出非常長的字符串,則更快失敗。它不但是,忽略任何分組字符,如,',不過這可能會讓如果有人想很容易的添加(我沒有):

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