2017-04-13 1 views
2

私は別の開発者のコ​​ードを使っています。C#10進数の文化的な依存です

私は、文字列を解析する際に文化情報を適切に使用する必要があることを理解しています。そうしないと、「1.2」対「1,2」型の問題が発生します。この場合、開発者は10進数として格納されている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 Er ...何?いいえ、 '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);を使用して、あなたは正確な値を得ることができます

関連する問題