Double.TryParse() ignores NumberFormatInfo.NumberGroupSizes?
本文关键字:NumberFormatInfo NumberGroupSizes ignores TryParse Double | 更新日期: 2023-09-27 18:20:22
我想知道我是否遗漏了什么。。。我在标准的英国文化下跑步。
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指示数字字符串可以具有组分离器;例如,将数百与数千分开。有效的组分隔符由的NumberGroupSeparator和CurrencyGroupSeparater属性NumberFormatInfo和每组中的位数的NumberGroupSizes和CurrencyGroupSizes属性NumberFormatInfo。
NumberStyles.Any中包含Allow数千。对于我的区域性,NumberGroupSizes为3。这只是Double.Parse中的一个错误吗?似乎不太可能,但我看不出我做错了什么。。。。
这只是意味着输入字符串可以包含零个或多个NumberFormatInfo.NumberGroupSeparator
实例。此分隔符可用于分隔任何大小的数字组;不仅仅是数千人。在将小数格式化为字符串时使用CCD_ 2和CCD_。使用Reflector,似乎NumberGroupSeparator
只用于确定字符是否是分隔符,如果是,则跳过它。根本不使用CCD_ 5。
如果你想验证字符串,你可以使用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;
}