从指数符号中解析数字

问题描述 投票:78回答:9

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

c# .net number-formatting exponent
9个回答
159
投票

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

decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);

45
投票

如果指定NumberStyles.Float,则有效:

NumberStyles.Float

我不完全确定为什么默认情况下不支持此功能-默认为使用decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float); Console.WriteLine(x); // Prints 0.012345 ,它使用AllowLeadingWhite,AllowTrailingWhite,AllowLeadingSign,AllowTrailingSign,AllowDecimalPoint和AllowThousands样式。可能与性能有关;我猜想,指定指数是[[相对很少。


34
投票
除了指定NumberStyles外,我建议您使用

decimal.TryParse函数,例如:

NumberStyles.Number
作为NumberStyles的替代方法。如果您确定自己的格式,则可以使用任何特定的集合。例如:

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


11
投票
NumberStyles.AllowExponent | NumberStyles.Float

7
投票
请谨慎选择答案:在

Decimal.Parse中指定System.Globalization.NumberStyles.Float的微妙之处可能会导致System.FormatException,因为您的系统可能是等待以','而不是'。'格式的数字例如,以法语表示法,“ 1.2345E-02”无效,您必须先将其转换为“ 1,2345E-02”。

最后,使用以下内容:

decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);


3
投票
[我发现在某些情况下传入Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float); 会更改处理字符串的规则,并导致与NumberStyles.Float不同的输出(NumberStyles.Number使用的默认规则)。

1
投票
关于使用NumberStyles.Any的警告:

0
投票
您无需替换圆点(分别用逗号),只需指定输入IFormatProvider:

0
投票
如果要检查和转换指数值,请使用此
© www.soinside.com 2019 - 2024. All rights reserved.