将字符串解析为浮点数 C#

12

我有一个浮点数字符串。但是有一个问题,该数字使用 "." 而不是 "," 作为小数点。

这段代码无法工作:

MyNumber = float.Parse("123.5");

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

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

但是有没有其他方法可以实现呢?

3个回答

24

使用字符串替换非常脆弱,会导致难以察觉的错误。可以指定 IFormatProvider 来代替。例如:

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

或者您可以使用Parse的另一个重载来指定NumberFormatInfo


2
为什么要使用 nl-NL 而不是 CultureInfo.InvariantCulture - Jonas Elfström
2
@Jonas:nl-NL只是一个例子,但仔细阅读问题后,我注意到OP的CultureInfo.CurrentCulture使用,作为小数分隔符。荷兰文化(nl)实际上使用,作为小数分隔符,因此将不起作用。所以诀窍是实际设置一个使用.作为小数分隔符的文化,如'en-US'和不变文化。感谢您提出这个问题。 - Steven

8
为了回答Steven的问题,重要的不是争论不同的观点,而是弄清楚为什么小数点分隔符是“.”。
如果是因为源文件是以计算机可读格式存储的,并且在文档规范中指定了小数点分隔符,则应像Steven一样使用“CultureInfo.InvariantCulture”。
如果是人工输入的特定语言环境,则需要使用适合该语言环境的“CultureInfo”匹配该语言环境,否则如果软件在不同的语言环境下使用,则会出现相反的问题。通常,您需要设置线程的“CurrentCulture”以匹配此设置(格式的“CurrentCulture”,语言的“CurrentUICulture”)。如果已经这样做了,那么您根本不需要传递任何文化,因为形式“float.Parse(string)”使用该文化-但是,您可能希望使用“float.Parse(string, CurrentCulture)”来明确表达您正在执行的操作(并消除某些软件分析在您没有以这种方式具体说明时所抱怨的情况)。
真正棘手的问题是,如果您可能需要接受小数点和逗号,这将变得非常棘手-尤其是因为许多使用小数点作为小数分隔符的文化使用逗号作为千位分隔符,最终无法保证无歧义解析。但是,假设千位分隔符问题不影响您,则您在问题中提供的代码就是正确的方法,尽管我建议您相反地(替换逗号为小数点),然后使用不变的文化解析,因为这将消除由更多文化变化引起的任何进一步复杂性。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接