Convert.ToDecimal 引发的意外异常

Posted

技术标签:

【中文标题】Convert.ToDecimal 引发的意外异常【英文标题】:Unexpected exception thrown by Convert.ToDecimal 【发布时间】:2013-07-11 11:20:47 【问题描述】:

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

Convert.ToDecimal("3.14521963414679E-08")

抛出

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

但是这是否按预期工作?

Convert.ToDouble("3.14521963414679E-08")

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

【问题讨论】:

哪种异常? 可能是因为E- 部分? A FormatException:“输入字符串的格式不正确。”我认为 Convert.ToDecimal 可以处理指数? 不要在 cmets 中添加其他信息,请编辑问题。 double.Parse() 可以,但decimal.Parse() 不能。这些是调用Convert.To...时调用的方法。 【参考方案1】:

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

据记录,Convert.ToDecimal 内部使用Decimal.Parse,而documentation 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);

【讨论】:

呃..我不明白为什么没有选择这个答案。 这实际上更有用地回答了这个问题,所以我已将其切换为接受的答案。【参考方案2】:

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

【讨论】:

谢谢 - 这是一个非常有用的补充 Soner【参考方案3】:

因为这个->

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

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

如需进一步说明,请访问 - http://msdn.microsoft.com/en-us/library/System.Convert_methods.aspx

希望对你有帮助..:)

【讨论】:

以上是关于Convert.ToDecimal 引发的意外异常的主要内容,如果未能解决你的问题,请参考以下文章

decimal.TryParse和Convert.ToDecimal+try{} catch{}的性能比较

Decimal.Parse() 与 Convert.ToDecimal() [重复]

为啥 Convert.ToDecimal(3.1922) 显示为 31922?

使用 Convert.ToDecimal() 会导致 C# 中的值四舍五入。如何克服这个问题?

VB.Net Convert ToDecimal 不适用于逗号

调用 new(堆)后由意外的汇编代码引发的异常