2011-03-19 110 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);