2011-03-19 114 views
8

我有字符串中的浮点数。有一个问题。号码使用“。”不是“,”作为小数点。解析字符串以浮点数C#

这个代码不工作:

MyNumber = float.Parse("123.5"); 

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

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

但是有没有其他方法可以做到这一点?

回答

6

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

如果这是因为源代码是计算机可读的格式,其中的周期小数分隔符被指定为文档规范的一部分,那么我会像Steven一样使用CultureInfo.InvariantCulture

如果它是特定语言环境中的人类输入,那么您希望将该语言环境的CultureInfo与适合该语言环境的语言环境匹配,否则如果该软件与不同的语言环境一起使用,则会出现相反的问题。通常,您希望将线程的CurrentCulture设置为与此匹配(格式为CurrentCulture,语言为CurrentUICulture)。如果你已经这样做了,那么你根本不需要传递文化,因为表格float.Parse(string)使用该文化 - 但是,您可能希望使用float.Parse(string, CurrentCulture)来明确表示这是您正在做的事情(并且要关闭通过这种方式进行一些软件分析,这些软件分析会在你不具体的情况下投诉)

如果你可能不得不接受句点和逗号 - 尤其是因为许多使用句点作为小数点分隔符的文化,使用逗号作为千位分隔符,最终不可能保证明确的解析。然而,假设数千个问题不影响你,那么你在你的问题中给出的代码就是方法,尽管我建议做相反的事情(用句点替换逗号),然后用不变的文化进行解析,因为这会删除任何更多的文化变化导致进一步的并发症。

20

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

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

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

+2

为什么'NL-NL'而不是'CultureInfo.InvariantCulture'? – 2011-03-19 23:23:50

+2

@Jonas:'nl-NL'只是一个例子,但在仔细阅读问题之后,我注意到OP的CultureInfo.CurrentCulture具有'''作为小数点分隔符。荷兰文化(nl)实际上使用','作为小数分隔符,因此*不会*起作用。所以,诀窍在于,像'en-US'和不变文化一样,设置一个使用'.'作为小数点分隔符的文化。感谢您提出这个问题。 – Steven 2011-03-19 23:29:53

1

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

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

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

如果你严格不想culturespecific然后

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