1

私はこのコード行を持っています:

System.Convert.ChangeType(input, destinationType, CultureString);

de-DEのカルチャで呼び出され、入力が4,50で、destinationTypeがdoubleの場合、4.50を返します。

en-GBで同じものを呼び出すと、450.00に変換されます。

4.50を返すようにする方法や、4,50をdoubleに変換できないという例外をスローする方法はありますか?

ありがとう

4

3 に答える 3

2

使用している特定のオーバーロードについてMSDNから指定されているように、次のようになります。

指定されたオブジェクトと同等の値を持つ指定されたタイプのオブジェクトを返します。パラメーターは、カルチャ固有のフォーマット情報を提供します。

つまり、カルチャのフォーマット情報に基づいて変換する方法を理解しようとします。つまり4,50de-DE4.5では、en-GBと同じ番号が識別されます(コンマではなくピリオドがあることに注意してください)。 en-GBカルチャでは、4,50が解析されるときに、数千について話すためにコンマが使用されます(たとえば、4000を書き込むことができます)。コンマは無視されるため、出力は450になります。4.50
4,000

これは、2010年1月21日の日付が米国で解析され01/21/10た(mm / dd / yy)のと同じです21/01/10が、英国では解析されます(dd / mm / yy)。

したがって、実際には、4,50はdoubleに変換できるため、例外は発生しませんこれは、世界のどこにあるかによって異なります:)

注:カルチャに依存しない変換が必要な場合、C#にはCultureInfo.InvariantCultureがあります。

例外をスローしたい場合は、 ChangeTypeを使用せず、@ ChrisFが彼の回答で説明したように使用Double.Parseしてください。たとえば、これは例外をスローします。NumberStyles

Double.Parse("4,50", NumberStyles.Float);
于 2012-12-21T15:49:21.690 に答える
1

double.Parseではなくを使用する必要がありますChangeType

フラグを設定しないdouble.Parseと、例外をスローする可能性があります。NumberStyles.AllowThousands

NumberStyles.AllowThousandsは、グループ区切り文字が許可されることを示します。有効なグループ区切り文字は、現在のNumberFormatInfoオブジェクトのNumberGroupSeparatorまたはCurrencyGroupSeparatorプロパティによって決定されます。

MSDNページ

この場合、次を使用できます。

double result = double.Parse("4,50", numberStyle);

ここにあるように

指定する一般的な値は、FloatとAllowThousandsの組み合わせです。

したがって、あなたの場合、このフラグが設定されていないことを確認する必要があります。「4,500」を正しく解析できなかったことを意味しますが。

フラグを設定することにより、文字列を解析するときに千単位の区切り文字を単に無視するようにコードに指示します。これは、アルゴリズムに従って、次の文字列がすべて450に変換されることを意味します。

450
45,0
4,50
450、

于 2012-12-21T16:00:44.850 に答える
0

使用するDouble.Parse(input, style)

構文解析ははるかに厳密であり、System.Globalization.NumberStyles style何をするかを正確に指定でき、数値とは見なされません。FormatException文字列の内容が気に入らない場合は、をスローします。

于 2012-12-21T15:55:58.423 に答える