C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.85853 の関連記事表示

<< 0 >>
■85853  Re[1]: 指数表記された文字列の数値変換方法について
□投稿者/ 魔界の仮面弁士 -(2017/11/29(Wed) 09:42:45)
    No85832 (たかじ さん) に返信
    > 指数表記されている文字列(2.12345678975E9や3.4E+38など)を
    > decimalにTryParseすると、

    Decimal ではなく decimal と表記されていることからして、
    VB ではなく C# をお使いでしょうか。


    > 変換に失敗します。

    前者は、NumberStyles を受け取る TryParse のオーバーロードを使えば変換できますが、
    後者はどうやっても不可能です。最大値(decimal.MaxValue)を大幅に超えていますから…。

    3.4E+38 はおろか、3.4E+29 でも不可能です。(3.4E+28 なら変換できますけれども)
    System.Decimal の scale は 0〜28 の範囲しか指定できません。
    https://msdn.microsoft.com/ja-jp/library/bb1c1a6x.aspx


    なお System.Decimal は、有効桁数も含めて保持されるため、
     string s1 = "2.12345678975E9";

     string s2 = "2.12345678975000E9";
    は異なる変換結果になることにご注意ください。

    string s1 = "2.12345678975E9";
    string s2 = "2.12345678975000E9";

    NumberStyles ns = NumberStyles.AllowExponent | NumberStyles.Float;
    IFormatProvider fmt = CultureInfo.InvariantCulture;

    decimal d1, d2;
    Console.WriteLine(decimal.TryParse(s1, ns, fmt, out d1));
    Console.WriteLine(decimal.TryParse(s2, ns, fmt, out d2));
    Console.WriteLine(d1 == d2); // 値としては同じ
    Console.WriteLine(d1); // 有効桁数12桁で表示される
    Console.WriteLine(d2); // 有効桁数15桁で表示される
記事No.85832 のレス /過去ログ147より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -