这是我的问题(对于en-US):
Decimal.Parse("1,2,3,4")
返回1234,而不是抛出InvalidFormatException.
大多数Windows应用程序(Excel en-US)不会删除千位分隔符,也不会将该值视为十进制数.其他语言也会出现同样的问题(尽管字符不同).
还有其他十进制解析库可以解决这个问题吗?
谢谢!
有没有办法让C#TryParse()
函数更严格一些?
现在,如果你传入一个包含数字,正确的十进制和千位分隔符的字符串,它通常似乎接受它们,即使格式没有意义,例如: 123''345'678
如果数字格式不正确,我正在寻找一种TryParse
不成功的方法.
所以,我的总部设在苏黎世,如果我这样做:
decimal exampleNumber = 1234567.89m;
Trace.WriteLine(string.Format("Value {0} gets formatted as: \"{1:N}\"", exampleNumber, exampleNumber));
Run Code Online (Sandbox Code Playgroud)
...然后,根据我的区域设置,我得到了......
Value 1234567.89 gets formatted as: "1'234'567.89"
Run Code Online (Sandbox Code Playgroud)
所以你可以看到,对于我的区域,小数位字符是一个句号,千分隔符是一个撇号.
现在,让我们创建一个简单的函数来测试是否string
可以将其解析为decimal
:
private void ParseTest(string str)
{
decimal val = 0;
if (decimal.TryParse(str, out val))
Trace.WriteLine(string.Format("Parsed \"{0}\" as {1}", str, val));
else
Trace.WriteLine(string.Format("Couldn't parse: \"{0}\"", str));
}
Run Code Online (Sandbox Code Playgroud)
好吧,让我们用几个字符串来调用这个函数.
您认为以下哪个字符串可以被此函数成功解析?
以下是我得到的结果:
ParseTest("123345.67"); // 1. Parsed "123345.67" as 123345.67
ParseTest("123'345.67"); // 2. Parsed "123'345.67" as 123345.67
ParseTest("123'345'6.78"); // …
Run Code Online (Sandbox Code Playgroud) 我想知道我是否遗漏了某些东西......我正在按照标准的英国文化运作.
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中的一个错误吗?似乎不太可能,但我无法发现我做错了什么......
我正在使用ASP.NET MVC表单上的复选框,如下所示:
<%=Html.CheckBox("AgreeToRules", Model.AgreeToRules)%>
Run Code Online (Sandbox Code Playgroud)
模型上的AgreeToRules属性是一个布尔值.在测试期间,这一切都很好.但是,现在我们已经开始使用这个应用程序了,我发现以下消息传递中出现了相对较小但很多的错误:
System.Web.HttpUnhandledException:抛出了类型'System.Web.HttpUnhandledException'的异常.---> System.InvalidOperationException:从类型'System.String'到类型'System.Boolean'的参数转换失败.有关更多信息,请参阅内部异常.---> System.FormatException:Y不是Boolean的有效值.---> System.FormatException:String未被识别为有效的布尔值.
这似乎发生在视图引擎尝试在帖子后呈现表单时,并且从ValueProvider返回的复选框的值如下所示:
Y,假
要么
N,假
以原始形式呈现的html如下所示:
<input id="AgreeToRules" name="AgreeToRules" type="checkbox" value="true" />
<input name="AgreeToRules" type="hidden" value="false" />
Run Code Online (Sandbox Code Playgroud)
在测试期间,我期望(并显示)发布的值看起来像:
真假
如果选中或
假
如果没有检查.那么N和Y来自哪里?
我将用户代理添加到从错误处理程序返回的信息列表中,并且出现(到目前为止)所有错误都发生在带有FF 3.0.10的Windows XP下,但这正是我测试过的并且问题没有在测试过程中存在
有什么想法吗?