我想知道我是否想念某些东西……我在标准的英国文化下奔跑。

Double result = 0;
if (Double.TryParse("1,2,3", NumberStyles.Any, CultureInfo.CurrentCulture, out result))
{
   Console.WriteLine(result);
}

预期的输出将什么都不是...“1,2,3”不应该解析为 double 。但是确实如此。根据.NET 2.0 MSDN documentation



NumberStyles.Any中包含“允许成千上万”。根据我的文化,NumberGroupSizes为3。这只是Double.Parse中的错误吗?似乎不太可能,但我无法发现自己​​在做错什么...。

最佳答案

这只是意味着输入字符串可以包含零个或多个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;
}

关于c# - Double.TryParse()会忽略NumberFormatInfo.NumberGroupSizes吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8883801/

10-10 07:46