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

わんくま同盟

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

C# と VB.NET の入門サイト

■85853 / 1階層)  指数表記された文字列の数値変換方法について
□投稿者/ 魔界の仮面弁士 (1484回)-(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桁で表示される
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←指数表記された文字列の数値変換方法について /たかじ →Re[2]: 指数表記された文字列の数値変換方法について /たかじ
 
上記関連ツリー

指数表記された文字列の数値変換方法について / たかじ (17/11/28(Tue) 17:28) #85832
Re[1]: 指数表記された文字列の数値変換方法について / WebSurfer (17/11/28(Tue) 18:07) #85833
指数表記された文字列の数値変換方法について / 魔界の仮面弁士 (17/11/29(Wed) 09:42) #85853 ←Now
  └ Re[2]: 指数表記された文字列の数値変換方法について / たかじ (17/11/30(Thu) 16:33) #85904 解決済み
    └ Re[3]: 指数表記された文字列の数値変換方法について / 魔界の仮面弁士 (17/12/01(Fri) 11:13) #85915 解決済み
      └ Re[4]: 指数表記された文字列の数値変換方法について / たかじ (17/12/06(Wed) 10:14) #85967
        ├ Re[5]: 指数表記された文字列の数値変換方法について / 魔界の仮面弁士 (17/12/06(Wed) 13:31) #85971
        └ Re[5]: 指数表記された文字列の数値変換方法について / Hongliang (17/12/06(Wed) 11:59) #85970
          └ Re[6]: 指数表記された文字列の数値変換方法について / 魔界の仮面弁士 (17/12/06(Wed) 14:16) #85972
            └ Re[7]: 指数表記された文字列の数値変換方法について / たかじ (17/12/07(Thu) 19:00) #85999 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信