从指数表示法解析数字

Jim*_*mbo 81 .net c# exponent number-formatting

我需要将字符串"1.2345E-02"(以指数表示法表示的数字)解析为十进制数据类型,但Decimal.Parse("1.2345E-02")只是抛出一个错误

Han*_*ant 161

这是一个浮点数,你必须告诉它:

decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 45

如果您指定NumberStyles.Float:

decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float);
Console.WriteLine(x); // Prints 0.012345
Run Code Online (Sandbox Code Playgroud)

我不完全确定为什么默认情况下不支持这个 - 默认是使用NumberStyles.Number,它使用AllowLeadingWhite,AllowTrailingWhite,AllowLeadingSign,AllowTrailingSign,AllowDecimalPoint和AllowThousands样式.可能与性能有关; 我想,指定一个指数是相对罕见的.


Sve*_*son 34

除了指定NumberStyles之外,我还建议您使用decimal.TryParse函数,例如:

decimal result;
if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) )
{
     // do something in case it fails?
}
Run Code Online (Sandbox Code Playgroud)

作为NumberStyles.Any的替代方案,如果您确定自己的格式,可以使用特定的集合.例如:

NumberStyles.AllowExponent | NumberStyles.Float
Run Code Online (Sandbox Code Playgroud)


Mit*_*eat 11

decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
Run Code Online (Sandbox Code Playgroud)


Joe*_*ips 10

默认值NumberStyledecimal.Parse(String)NumberStyles.Number因此如果您只想添加允许指数的功能,那么您可以执行按位或来包含NumberStyles.AllowExponent

decimal d = decimal
    .Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent);
Run Code Online (Sandbox Code Playgroud)


Kwe*_*ell 7

请谨慎选择答案:在Decimal.Parse中有一个指定System.Globalization.NumberStyles.Float的子容量,它可能导致System.FormatException,因为您的系统可能正在等待用','而不是'.'格式化的数字.

例如,在法语表示法中,"1.2345E-02"无效,您必须先将其转换为"1,2345E-02".

总之,使用以下内容:

Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);
Run Code Online (Sandbox Code Playgroud)

  • 最好使用CultureInfo.InvariantCulture作为Parse的第3个参数 (9认同)
  • 你是绝对正确的。我不明白为什么没有人提出这个问题。 (2认同)

bas*_*gio 5

我发现NumberStyles.Float,在某些情况下,传入 会更改处理字符串的规则,并导致与NumberStyles.Number( 所使用的默认规则decimal.Parse)不同的输出。

例如,以下代码将FormatException在我的机器中生成:

CultureInfo culture = new CultureInfo("");
culture.NumberFormat.NumberDecimalDigits = 2;
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Decimal.Parse("1,234.5", NumberStyles.Float, culture); // FormatException thrown here
Run Code Online (Sandbox Code Playgroud)

我建议使用 input NumberStyles.Number | NumberStyles.AllowExponent,因为这将允许指数数字,并且仍然会根据规则处理字符串decimal

CultureInfo culture = new CultureInfo("");
culture.NumberFormat.NumberDecimalDigits = 2;
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Decimal.Parse("1,234.5",NumberStyles.Number | NumberStyles.AllowExponent, culture); // Does not generate a FormatException
Run Code Online (Sandbox Code Playgroud)

要回答发帖者的问题,正确答案应该是:

decimal x = decimal.Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent);
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)