Double.TryParse()忽略NumberFormatInfo.NumberGroupSizes?

时间:2012-01-16 17:24:53

标签: c# .net parsing double

我想知道我是否遗漏了某些东西......我正在按照标准的英国文化运作。

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表示数字字符串可以包含组   分离;例如,将数百个与数千个分开。   有效的组分隔符由。确定   NumberGroupSeparator和CurrencyGroupSeparator属性   确定NumberFormatInfo和每个组中的位数   由NumberGroupSizes和CurrencyGroupSizes属性   的NumberFormatInfo。

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

1 个答案:

答案 0 :(得分:5)

这只意味着输入字符串可以包含零个或多个NumberFormatInfo.NumberGroupSeparator个实例。此分隔符可用于分隔任何大小的数字组;不只是数以千计。将小数位格式化为字符串时使用NumberFormatInfo.NumberGroupSeparatorNumberFormatInfo.NumberGroupSizes。使用Reflector似乎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;
}