2012-01-16 58 views
7

我想知道我是否失去了一些東西...我正在標準的英國文化下運行。Double.TryParse()忽略NumberFormatInfo.NumberGroupSizes?

Double result = 0; 
if (Double.TryParse("1,2,3", NumberStyles.Any, CultureInfo.CurrentCulture, out result)) 
{ 
    Console.WriteLine(result); 
} 

預期的輸出結果不算什麼......「1,2,3」不應該解析爲雙精度。但它確實如此。根據.NET 2.0 MSDN documentation

AllowThousands表示數字字符串可以有組 分隔符;例如,將數百人與數千人分開。 有效組分隔字符是由 的NumberFormatInfo的 NumberGroupSeparator和CurrencyGroupSeparator屬性和每個組中的數字被確定 通過 的NumberFormatInfo的NumberGroupSizes和CurrencyGroupSizes屬性的數目來確定。

允許數千包含在NumberStyles.Any中。 NumberGroupSizes是3我的文化。這只是Double.Parse中的一個錯誤?似乎不太可能,但我不能發現我做錯了什麼....

+0

這可能是爲什麼我在測試時得到有效的結果[我的回答](http://stackoverflow.com/questions/1014535/float-parse-doesnt-work-the -way-i-wanted/1014559#1014559)上的類似問題。 – ChrisF 2012-01-16 17:28:13

+0

只是好奇,但結果的價值是什麼? – Aaron 2012-01-16 17:45:46

+0

我想你應該問問微軟是否有錯誤,但是我得到和你一樣的行爲。總是可以做'NumberStyles.Any^NumberStyles.AllowThousands',但如果你期待三個合法團體,這並沒有多大用處。 – Jodrell 2012-01-16 17:48:23

回答

5

它只是意味着輸入字符串可以包含零個或多個NumberFormatInfo.NumberGroupSeparator實例。此分隔符可用於分隔任何大小的數字組;不只是數千人。在將小數格式化爲字符串時使用NumberFormatInfo.NumberGroupSeparatorNumberFormatInfo.NumberGroupSizes。使用反射器,似乎NumberGroupSeparator僅用於確定字符是否是分隔符,如果是,則跳過。根本不使用NumberGroupSizes

如果你想驗證字符串,你可以使用RegEx或者寫一個方法來實現。這裏有一個我砍死在一起:

string number = "102,000,000.80"; 
var parts = number.Split(','); 
for (int i = 0; i < parts.Length; i++) 
{ 
    var len = parts[i].Length; 
    if ((len != 3) && (i == parts.Length - 1) && (parts[i].IndexOf('.') != 3)) 
    { 
     Console.WriteLine("error"); 
    } 
    else 
    { 
     Console.WriteLine(parts[i]); 
    } 
} 

// Respecting Culture 
static Boolean CheckThousands(String value) 
{ 
    String[] parts = value.Split(new string[] { CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator }, StringSplitOptions.None); 
    foreach (String part in parts) 
    { 
     int length = part.Length; 
     if (CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes.Contains(length) == false) 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+0

+1,看起來'NumberGroupSizes'在解析時被忽略(內部方法是Number.ParseNumber')。 – user7116 2012-01-16 18:11:29

+0

我剛開始使用Reflector進行挖掘,但還沒有足夠的時間讓它遠遠落後。實際上,我正在考慮使用正則表達式,但我需要小心並確保它仍然是文化意識。 – Ian 2012-01-17 08:50:57

+0

@Ian您可以根據每種文化中存儲在NumberFormatInfo中的信息構建您的Regex表達式。 – 2012-01-17 09:16:56