文字列 "1.2345E-02" (指数表記で表される数値) を 10 進数データ型に解析する必要がありますが、Decimal.Parse("1.2345E-02")
単純にエラーがスローされます。
10 に答える
これは浮動小数点数です。次のように指定する必要があります。
decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
次のように指定すると機能しますNumberStyles.Float
。
decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float);
Console.WriteLine(x); // Prints 0.012345
これがデフォルトでサポートされていない理由は完全にはNumberStyles.Number
わかりません. おそらくパフォーマンスに関連しています。指数を指定することは比較的まれだと思います。
NumberStyles を指定することに加えて、次のようなdecimal.TryParse関数を使用することをお勧めします。
decimal result;
if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) )
{
// do something in case it fails?
}
NumberStyles.Any の代わりに、フォーマットが決まっている場合は特定のセットを使用できます。例えば:
NumberStyles.AllowExponent | NumberStyles.Float
decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
選択した回答には注意してください。Decimal.ParseでSystem.Globalization.NumberStyles.Floatを指定するサブティリティがあり、システムが「.」ではなく「,」でフォーマットされた数値を待機している可能性があるため、System.FormatExceptionが発生する可能性があります。
たとえば、フランス語表記では「1.2345E-02」は無効です。最初に「1,2345E-02」に変換する必要があります。
結論として、次の行に沿って何かを使用します。
Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);
NumberStyles.Any の使用に関する警告:
「6.33E+03」は期待どおり 6330 に変換されます。ドイツ語では、小数点はコンマで表されますが、6,33E+03 は 633000 に変換されます! データを生成する文化は不明であり、データを操作している文化とは異なる可能性があるため、これは顧客にとって問題です。私の場合、私は常に科学表記法を持っているので、解析する前にコンマをいつでも小数点に置き換えることができますが、1,234,567 のようなきれいにフォーマットされた数値のような任意の数値を扱う場合、そのアプローチは機能しません。