2012-01-18 31 views
3

我正在寫一些代碼來將字符串解析爲一個double,但是這個字符串是從另一臺機器傳給我的。當然,一個問題發生在文化可能不同的地方。所以,雖然機器A可能送我:因爲它是在德國,有不同的文化解析來自C中不同文化的數字

"0.5" 

機B可能給我

"0,6" 

正確解析這兩個輸入的最佳方法是什麼?有人建議使用CultureInfo.InvariantCulture作爲Convert.ToDouble的參數,但是這不僅僅有助於在哪裏產生上述字符串,而不是當別人可以向我發送不同的字符串?

我在想我需要知道源文化並在嘗試轉換之前更改Thread.CurrentThread.CurrentCulture以匹配嗎?

+1

這不是因爲它在德國,而是因爲程序員對這個問題無知 - 可悲的是太常見了。 Alll外部溝通應該在INVARIANT文化中。當你做String.Format時,FxCop甚至警告說在.NET中。 – TomTom 2012-01-18 11:31:01

+0

謝謝,有道理。我現在更瞭解使用不變文化。 – Martin 2012-01-18 11:51:44

回答

1

這是一臺機器還是一個人發送這個?如果它是一臺機器 - 也就是說,另一臺機器上有一個應用程序決定發送什麼數據,而不是用戶輸入的「盲目」傳輸,那麼這種事情的格式應該是指定的而不是區域設置相關的。一般而言,這意味着您同意使用CultureInfo.InvariantCulture或等同於其他應用程序不是.NET的文化。

如果是一個人,你知道他們的語言環境,那麼你可以使用double.Parse(decString, cultureInfo)。如果某些講英語的人借用了講德語的朋友的電腦,這可能會失敗。

如果你知道不會有任何分組分隔符(例如123,456.78或123'457,78),那麼你可以使用double.Parse(decString.Replace(',', '.'), CultureInfo.InvariantCulture)但不能如果有集團作爲這意味着123,456.78變得123.456.78

+0

謝謝,這是我需要掌握問題的背景,現在我明白爲什麼人們使用不變文化。 – Martin 2012-01-18 11:46:49

+0

是的,不變文化根本不是一種文化。這是爲了進行相同的操作(以字符串顯示數字等),故意隱藏文化差異,因爲它只涉及機器。 – 2012-01-18 11:52:34

3

如果您知道源文化,並且可以獲得代表它的實例CultureInfo,則可以將其作爲參數傳遞給Convert.ToDoubleDouble.Parse方法。舉例來說,如果你有這個從(已知)德國用戶:

var cultureInfo = CultureInfo.GetCultureInfo("de-DE"); 
double result = Double.Parse("0,5", cultureInfo); 

如果你不知道,但有源文化的一個有限的範圍內,那麼你可以使用一些Double.TryParse嘗試與不同文化。但是,正如下面已經指出的那樣,「1000」可能會有很大不同的含義,這取決於文化...

2

是的,要可靠地解析數字,您需要了解源文化。

+1

+1,特別是在「1,123」和「1.123」的情況下。 – 2012-01-18 11:34:15

0

最好的情況是發送方和接收方總是使用相同的文化傳輸數據。在你目前的情況下:即使是德國的機器也應該發送「0.5」。

理論上的下一個最好的事情是調整接收者的設置以符合發件人的設置。雖然在實踐中這比以前的案例更難:如果沒有發件人的合作,就無法準確識別文化。當你能讓發送者合作時,你最好強迫它發送你想要的文化。所以你幾乎沒有在實踐中看到這一點。

如果您不控制源,剩下的唯一選擇是嘗試檢測文化,調整解析並希望它能正常工作。不過,期望它是一個不斷出現的錯誤來源。


所以做的最好的事情,就是要解決一個文化(通常InvariantCulture),調整發件人。長遠來看,你會過得更好。

+0

感謝有關保持發件人/收件人之間文化相同的背景。 – Martin 2012-01-18 11:47:27