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文档

AllowThousands表示数字字符串可以有组分隔符; 例如,将数百个与数千个分开。 有效的组分隔符由NumberFormatInfo的NumberGroupSeparator和CurrencyGroupSeparator属性确定,每个组中的位数由NumberFormatInfo的NumberGroupSizes和CurrencyGroupSizes属性确定。

允许数千包含在NumberStyles.Any中。 对于我的文化,NumberGroupSizes是3。 这只是Double.Parse中的一个错误吗? 似乎不太可能,但我无法发现我做错了什么……

它只是意味着输入字符串可以包含零个或多个NumberFormatInfo.NumberGroupSeparator实例。 此分隔符可用于分隔任何大小的数字组; 不只是数以千计。 将小数格式化为字符串时使用NumberFormatInfo.NumberGroupSeparatorNumberFormatInfo.NumberGroupSizes 。 使用Reflector,似乎NumberGroupSeparator仅用于确定字符是否为分隔符,如果是,则跳过它。 NumberGroupSizes不使用NumberGroupSizes

如果要validation字符串,可以使用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; }