解析字符串以浮点数C#

时间:2011-03-19 23:14:17

标签: c# .net string parsing floating-point

我在字符串中有浮点数。有一个问题。数字使用“。”不是“,”作为小数点。

此代码无效:

MyNumber = float.Parse("123.5");

我知道在解析之前我可以使用字符串替换功能来“修复”这个字符串。

MyNumber = float.Parse("123.5".Replace('.',',');

但还有其他办法吗?

3 个答案:

答案 0 :(得分:22)

使用字符串替换是非常脆弱的,并将导致suttle错误。请改为指定IFormatProvider。例如:

MyNumber = float.Parse("123.5", CultureInfo.InvariantCulture);

或者您可以使用NumberFormatInfo的其他重载指定Parse

答案 1 :(得分:7)

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

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

如果它是特定语言环境中的人工输入,那么您希望通过适合该语言环境的CultureInfo来匹配该语言环境,否则如果该软件与其他语言环境一起使用,则恰恰存在相反的问题。通常,您需要设置线程的CurrentCulture以匹配此格式(格式为CurrentCulture,语言为CurrentUICulture)。如果您已经这样做了,那么您根本不需要传递文化,因为float.Parse(string)形式使用了这种文化 - 但是,您可能希望使用float.Parse(string, CurrentCulture)来明确这是你正在做什么(并关闭一些软件分析,当你不具备这种方式时会抱怨)。

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

答案 2 :(得分:1)

这取决于当前执行的线程文化的当前文化。

float.Parse("123,5", system.threading.thread.currentthread.currentculture); 

float.Parse("123.5", system.threading.thread.currentthread.currentculture); 

如果你严格不想要特定的文化,那么

float.Parse("123.5", CultureInfo.InvariantCulture);