オブジェクトを取得して必要な型に変換する数値コンバーターを実装しようとしています。
ただし、問題が見つかりました。「en-US」カルチャで「1,5」をテストすると、Convert.ToSingle および Convert.Double は、この値を変換できないという例外をスローする代わりに、単に「15」を返します。 「1,5」は無効なので期待してください。
誰かが理由を知っていますか?
いいえ、"1,5"
完全に有効です。"1,500"
に解析する方法に似ています1500
。基本的に、グループ セパレータ ( ,
en-US) は解析時に単純に無視されます。
これを行いたくない場合は、次を指定しますNumberStyles
。
int i = int.Parse("1,5", NumberStyles.Integer);
[Flags]
これは列挙型であり、重要なことに、 を含めていないことに注意してくださいAllowThousands
。別のアプローチは次のとおりです。
int i = int.Parse("1,5", NumberStyles.Any & ~ NumberStyles.AllowThousands);
これにより、グループ セパレータ以外のすべてが許可されます。もちろん、"1,500"
今は失敗します。
たとえば、ロシア文化 - ru-RU を指定すると機能しますが、en-US を使用する場合はドットを使用する必要があります。
コンマは en-US の 3 桁ごとの区切り文字であるため、受け入れられます。
またはを使用する代わりにToDouble()
またはToSingle()
を使用する代わりに、これらの関数には追加のパラメーターがあり、どの形式を受け入れる/拒否するかをより細かく制御できます-ここのリストを参照してください- たとえば、グループセパレーターを明示的に受け入れ/拒否できます。Double.TryParse()
Single.TryParse()
style
これは、コンマが有効なグループ セパレータであるためです (1000 単位を示すために使用されます)。
したがって、「1,5」は英語を話す人間には意味がありませんが、コンマは解析によって無視されるため、値は「15」として扱われます。