2010-04-27 55 views
11

我們開發了一套既可以在所有已知的計算機上運行的軟件。問題是解析以「8」開頭的字符串。 字符串開頭的「8」好像是一個保留字符。「8」的int.Parse失敗。 int.Parse總是需要CultureInfo.InvariantCulture?

Parsing: 
int.Parse("8") -> Exception message: Input string was not in a correct format. 
int.Parse("80") -> 0 
int.Parse("88") -> 8 
int.Parse("8100") -> 100 

CurrentCulture: sv-SE 
CurrentUICulture: en-US 

的問題是使用int.Parse( 「8」,CultureInfo.InvariantCulture)解決。但是,最好知道問題的根源。

問題:如果我們沒有指定不變文化,爲什麼我們會得到這個「8」的行爲?


其他信息:

我確實派了一個小程序,以我的客戶達到上述的結果:

private int ParseInt(string s) 
    { 
     int parsedInt = -1000; 
     try 
     { 
      parsedInt = int.Parse(s); 

      textBoxMessage.Text = "Success: " + parsedInt; 

     } 
     catch (Exception ex) 
     { 
      textBoxMessage.Text = 
       string.Format("Error parsing string: '{0}'", s) + Environment.NewLine + 
       "Exception message: " + ex.Message; 
     } 

     textBoxMessage.Text += Environment.NewLine + Environment.NewLine + 
      "CurrentCulture: " + Thread.CurrentThread.CurrentCulture.Name + "\r\n" + 
      "CurrentUICulture: " + Thread.CurrentThread.CurrentUICulture.Name + "\r\n"; 
     return parsedInt; 
    } 

更新

我偶然發現這個環節,在微軟連接數據庫的錯誤:

https://connect.microsoft.com/VisualStudio/feedback/details/253265/int32-parse-fails-to-convert-the-string-0-zero-on-some-systems

好像有,有着相近的症狀的問題,但沒有真正的根本原因。如果有人能詳細說明這一點,我將不勝感激!

回答

21

對於sv-SE文化8代表CurrencyNegativePattern這就是爲什麼你會得到你描述的錯誤。

您可以通過運行下面的例子檢查:

var ci = new CultureInfo("sv-SE"); 

var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); 

Console.WriteLine(nfi.CurrencyNegativePattern); 
Console.WriteLine(nfi.CurrencyPositivePattern); 

這將輸出:

可以明確地說,你正在使用Parse解析一個整數,而不是貨幣超載,接受枚舉NumberStyles

Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE")); 

這次你指定你正在解析一個整數,不會發生錯誤。


然而,IIRC的Int32.Parse應該解釋爲輸入默認的整數,那麼爲什麼你要來與示例代碼的錯誤是超越我。


更新:

從您最近添加看來你應該確保問題不是外部的信息。這是,例如,如果用戶更改Windows區域的積極跡象設置8這將是正常的,可以完美地讓你得到你所獲得的誤差。這將是就像設置+作爲積極的跡象,然後試圖解析它:

var ci = new CultureInfo("sv-SE"); 
var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); 

nfi.PositiveSign = "+"; 

Int32.Parse("+", nfi); // This will throw 

詢問用戶它的區域的註冊表設置,如在連接問題表示,並檢查他們是你所期望的。

附註:歡迎SO和需要進一步的信息添加到你的問題的方式下一次,你應該改爲編輯在回答中提供它。

+0

感謝您的注意事項,我照顧它:) 我已經檢查了他的區域設置的註冊表中的值,只有8是有CurrencyNgativePattern這不會幫助我重現錯誤在我的機器上。 你肯定在這裏正軌若昂的。但是,這個問題很難,我不確定微軟是否也知道問題的原因。你肯定會得到一個大起來的,但這種行爲仍然是一個謎。這就是爲什麼我不接受你的答案,儘管我對你的努力表示感謝的解決方案! – 2010-04-27 13:08:04

+3

這個答案的開頭在我看來是錯誤的。在'NumberFormatInfo.CurrencyNegativePattern'和'NumberFormatInfo.CurrencyPositivePattern'僅使用作爲鍵的值 - 來識別負號的順序( - ),貨幣符號,以及將要用於格式化/解析號碼本身。例如,「8」作爲CurrencyNegativePattern'的'值意味着圖案應該是「-n $」。 – 2013-03-01 19:15:13