Ian*_*Ian 7 .net c# double parsing
我想知道我是否遗漏了某些东西......我正在按照标准的英国文化运作.
Double result = 0;
if (Double.TryParse("1,2,3", NumberStyles.Any, CultureInfo.CurrentCulture, out result))
{
Console.WriteLine(result);
}
Run Code Online (Sandbox Code Playgroud)
预期的产出将毫无意义......"1,2,3"不应该解析为双倍.不过确实如此.根据.NET 2.0 MSDN文档
AllowThousands表示数字字符串可以有组分隔符; 例如,将数百个与数千个分开.有效的组分隔符由NumberFormatInfo的NumberGroupSeparator和CurrencyGroupSeparator属性确定,每个组中的位数由NumberFormatInfo的NumberGroupSizes和CurrencyGroupSizes属性确定.
允许数千包含在NumberStyles.Any中.对于我的文化,NumberGroupSizes是3.这只是Double.Parse中的一个错误吗?似乎不太可能,但我无法发现我做错了什么......
它只是意味着输入字符串可以包含零个或多个实例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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2371 次 |
| 最近记录: |