Convert.ToDecimal抛出的意外异常

时间:2013-07-11 11:20:48

标签: c# .net types scientific-notation

这可能是一个旧的,但我找不到任何东西。有谁知道为什么这样:

Convert.ToDecimal("3.14521963414679E-08")

引发

  

FormatException(“输入字符串的格式不正确。”)

然而,这可以按预期工作?

Convert.ToDouble("3.14521963414679E-08")

我认为Convert.ToDecimal可以处理指数 - 也许我错了。

3 个答案:

答案 0 :(得分:8)

Convert.ToDecimal不支持科学记数法。

据记录,Convert.ToDecimal内部使用Decimal.Parsedocumentation for Decimal.Parse状态使用NumberStyles.Number,因此只有以下内容才是有效输入:

[ws][sign][digits,]digits[.fractional-digits][ws] 

要支持科学记数法,您必须使用Decimal.Parse的另一个重载,以允许您指定要使用的NumberStyles

var result = decimal.Parse("3.14521963414679E-08",
                           NumberStyles.Number | NumberStyles.AllowExponent);

答案 1 :(得分:1)

Convert.ToDecimal()方法明确使用Decimal.Parse()

来自 MSDN ;

  

表示数字字符串可以是指数表示法。该   AllowExponent标志允许解析的字符串包含指数   以“E”或“e”字符开头,后跟一个   可选的正号或负号和整数。换句话说,它   成功解析nnnExx,nnnE + xx和nnnE-xx形式的字符串。   它不允许小数点分隔符或有效数字符号或   尾数;要允许解析字符串中的这些元素,请使用   AllowDecimalPoint和AllowLeadingSign标志,或使用复合样式   包括这些单独的旗帜。

您可以使用此方法的Decimal.Parse Method (String, NumberStyles)重载,这样您就可以使用NumberStyles枚举;

Decimal.Parse("3.14521963414679E-08",
              NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint);

这是DEMO

答案 2 :(得分:0)

因为这个 - >

ToDecimal(String) - 将数字的指定字符串表示形式转换为等效的 十进制数。

ToDouble(String) - 将数字的指定字符串表示形式转换为 等效的双精度浮点数。

进一步澄清访问 - http://msdn.microsoft.com/en-us/library/System.Convert_methods.aspx

希望它有所帮助.. :)