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# 中的值四舍五入。如何克服这个问题?