Hoo*_*och 10 .net c# string floating-point parsing
我在字符串中有浮点数.有一个问题.数字使用"." 不是","作为小数点.
此代码无效:
MyNumber = float.Parse("123.5");
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用字符串替换功能在解析之前"修复"此字符串.
MyNumber = float.Parse("123.5".Replace('.',',');
Run Code Online (Sandbox Code Playgroud)
但还有其他办法吗?
Ste*_*ven 22
使用字符串替换是非常脆弱的,并将导致suttle错误.指定IFormatProvider代替.例如:
MyNumber = float.Parse("123.5", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
或者你可以指定NumberFormatInfo使用另一个重载Parse.
要添加到史蒂芬的问题,而不是争论不同,重要的是为什么小数点分隔符是..
如果是因为源是计算机可读格式,其中句点小数分隔符被指定为文档规范的一部分,那么我就像Steven在使用时那样CultureInfo.InvariantCulture.
如果它是特定区域设置中的人工输入,那么您可能希望将该区域设置与该区域设置相匹配CultureInfo,否则如果软件与不同的区域设置一起使用,则恰恰存在相反的问题.通常,您可能希望将线程设置CurrentCulture为与此匹配(CurrentCulture对于格式,CurrentUICulture对于语言).如果您已经这样做了,那么您根本不需要传递文化,因为表单float.Parse(string)使用了这种文化 - 但是,您可能希望float.Parse(string, CurrentCulture)明确表示这就是您正在做的事情(以及关闭一些文化)当你不具备这种方式时,抱怨的软件分析).
真正棘手的是,如果你可能必须同时接受句点和逗号 - 尤其是因为许多文化使用句点作为小数分隔符,使用逗号作为千位分隔符,最终不可能保证明确的解析.但是,假设成千上万的问题对您没有影响,那么您在问题中提供的代码就是方法,尽管我建议做相反的事情(用句点替换逗号)然后用不变文化进行解析,因为这会删除任何由更多的文化变化引起的进一步复杂化.