我想知道我是否遗漏了某些东西......我正在按照标准的英国文化运作。
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中的一个错误吗?似乎不太可能,但我无法发现我做错了什么......
答案 0 :(得分:5)
这只意味着输入字符串可以包含零个或多个NumberFormatInfo.NumberGroupSeparator
个实例。此分隔符可用于分隔任何大小的数字组;不只是数以千计。将小数位格式化为字符串时使用NumberFormatInfo.NumberGroupSeparator
和NumberFormatInfo.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;
}