我在字符串中有浮点数。有一个问题。数字使用“。”不是“,”作为小数点。
此代码无效:
MyNumber = float.Parse("123.5");
我知道在解析之前我可以使用字符串替换功能来“修复”这个字符串。
MyNumber = float.Parse("123.5".Replace('.',',');
但还有其他办法吗?
答案 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);