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.NumberGroupSeparator
和NumberFormatInfo.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; }