解析字符串以浮点数C#

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.

  • 为什么`nl-NL`而不是`CultureInfo.InvariantCulture`? (2认同)
  • @Jonas:`nl-NL`只是一个例子,但在仔细阅读了这个问题之后,我注意到OP的`CultureInfo.CurrentCulture`有`,`作为小数分隔符.荷兰文化(nl)实际上使用`,`作为小数分隔符,因此*不*工作.所以诀窍是实际设置一种文化,使用`.`作为小数分隔符,就像'en-US'和不变文化一样.谢谢你提出这个问题. (2认同)

Jon*_*nna 7

要添加到史蒂芬的问题,而不是争论不同,重要的是为什么小数点分隔符是..

如果是因为源是计算机可读格式,其中句点小数分隔符被指定为文档规范的一部分,那么我就像Steven在使用时那样CultureInfo.InvariantCulture.

如果它是特定区域设置中的人工输入,那么您可能希望将该区域设置与该区域设置相匹配CultureInfo,否则如果软件与不同的区域设置一起使用,则恰恰存在相反的问题.通常,您可能希望将线程设置CurrentCulture为与此匹配(CurrentCulture对于格式,CurrentUICulture对于语言).如果您已经这样做了,那么您根本不需要传递文化,因为表单float.Parse(string)使用了这种文化 - 但是,您可能希望float.Parse(string, CurrentCulture)明确表示这就是您正在做的事情(以及关闭一些文化)当你不具备这种方式时,抱怨的软件分析).

真正棘手的是,如果你可能必须同时接受句点和逗号 - 尤其是因为许多文化使用句点作为小数分隔符,使用逗号作为千位分隔符,最终不可能保证明确的解析.但是,假设成千上万的问题对您没有影响,那么您在问题中提供的代码就是方法,尽管我建议做相反的事情(用句点替换逗号)然后用不变文化进行解析,因为这会删除任何由更多的文化变化引起的进一步复杂化.