【C#】指数表記の文字列をdecimal型で扱う

指数表記文字列を decimal 型に変換するための Parse メソッドを使うとエラーが発生する問題の対方法です。

// 指数表記の文字列を変換するとエラーになる
string str = "-1.2345678E-07";
var value = decimal.Parse(str);
// System.FormatException: '入力文字列の形式が正しくありません。'

以下のように指定すると変換できるようになります。

// 第2引数に形式を指定する
var value = decimal.Parse(str, System.Globalization.NumberStyles.Float);

第2引数の NumberStyles に「NumberStyles.AllowExponent | NumberStyles.Float」みたいな指定は不要です。

また、小数点にカンマを使う地域(主にEU圏)でピリオドで小数点を表してる文字列を扱うと問題を起こすのでそれを避ける場合は、以下の通り第3引数を指定します。

using System.Globalization;
//...
var value = decimal.Parse(str, NumberStyles.Float, CultureInfo.InvariantCulture);

InvariantCulture を指定すると地域の表記の違いを無視して同じ動作を行います。小数点の表記はピリオドとカンマの2種類があるため指定が必要な場合がります。

InvariantCulture の小数点の表記はピリオドです。このためカンマ表記の地域で Parse などの変換メソッドで文字列を扱う場合、対象文字列に含まれる小数点はピリオド扱いとなります。

(逆にEU圏で数値を ToString するときにInvariantCultureを指定しないで文字列にすると 1,234...みたいなカンマ表記になって読み取る際に問題が起きることがあるので 数値⇔文字列 の相互変換の実装は注意が必要です)

確認環境

本記事は以下環境で確認しました。

  • .NET Framework 4.7.2
  • .NET 8.0
  • Visual Studio 2022