2017-04-13 40 views
2

我正在通過其他開發人員的一些代碼,我發現一些代碼似乎...好醜和不必要。是一個C#十進制文化依賴

我明白,當解析字符串時,我們需要正確使用文化信息,否則你可以進入「1.2」和「1,2」類型的問題。在這種情況下,開發人員正在使用以小數形式存儲的NumericUpDown。

float fValue = System.Convert.ToSingle(numericUpDown1.Value, System.Globalization.CultureInfo.InvariantCulture) 

我的問題是: - 是下面的代碼相同呢? - 文化信息能否妥善處理?
- 這個演員能拋出異常嗎?

float fValue = (float)numericUpDown1.Value; 

如果它們不相同(或安全),請解釋原因並提出「正確」解決方案嗎?

提前致謝!

回答

4

Convert.ToSingle(value, culture)來電((IConvertible)value).ToSingle(culture)decimalIConvertible.ToSingle然後忽略傳入的文化並返回Convert.ToSingle(value),它只返回(float)value

是的,你的代碼是等價的。

+0

_「然後忽略傳入的文化」_它不會忽略它。相反,重載'Convert.ToDouble(Object,IFormatProvider)'被執行。 – user2190035

+1

@ user2190035呃...什麼?不,不,'Convert.ToDouble'不涉及到轉換到'float' /'Single'。如果你不相信'float IConvertible.ToSingle(IFormatProvider provider)'忽略了[參考源](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/decimal.cs) '提供者'就像我在我的答案中寫的。 – hvd

+0

你說得對。不知道我在想什麼。 – user2190035

0

是的,只有在numericupdown1值很小的情況下,您的代碼才相當於。 但如果該值是41.00027357629127或類似的東西它將返回4.10002732E + 15。

所以,通過使用float.Parse(「numericUpDown1.Value」,CultureInfo.InvariantCulture.NumberFormat);你可以得到確切的值