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中的一个错误吗?似乎不太可能,但我看不出我做错了什么。。。。

Double.TryParse() ignores NumberFormatInfo.NumberGroupSizes?

这只是意味着输入字符串可以包含零个或多个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;
}
相关文章:
  • 没有找到相关文章