Decimal.Parse 和 Double.Parse System.FormatException 不同的行为
Posted
技术标签:
【中文标题】Decimal.Parse 和 Double.Parse System.FormatException 不同的行为【英文标题】:Decimal.Parse and Double.Parse System.FormatException Different behavior 【发布时间】:2013-10-14 15:06:00 【问题描述】:我不明白为什么在使用decimal.Parse
时必须指定NumberStyles.Float
而不是double.Parse
我能做到:
var tmp = double.Parse("1e-2");
但不是:
var tmp1 = decimal.Parse("1e-2");
因为System.FormatException
(输入字符串的格式不正确)被抛出
var tmp1 = decimal.Parse("1e-2", System.Globalization.NumberStyles.Float);
有人可以告诉我这种行为背后是否有充分的理由
【问题讨论】:
您的屏幕截图似乎在第 15 行显示失败无论您指定的内容。尽管第 14 行执行完全相同的操作,但您的最后一个似乎在第 15 行出现问题。真的吗? @JonSkeet 我知道,这太疯狂了。他们是真实的。我不是在开玩笑 Jon Skeet 有解释here 【参考方案1】:它只是按照记录的方式行事。来自Double.Parse
:
使用 NumberStyles.Float 和 NumberStyles.AllowThousands 标志的组合来解释 s 参数。
请注意,NumberStyles.Float
包括 NumberStyles.AllowExponent
。
来自Decimal.Parse
:
参数 s 使用 NumberStyles.Number 样式解释。
NumberStyles.Number
不包含NumberStyles.AllowExponent
。
我无法重现您奇怪的堆栈跟踪,这些跟踪似乎显示相同的调用在它工作后失败:
Decimal.Parse("1e-2")
对我来说总是失败
Decimal.Parse("1e-2", NumberStyles.Float)
总是为我工作
Double.Parse("1e-2")
总是为我工作
Double.Parse("1e-2", NumberStyles.Float)
总是为我工作
至于为什么“默认”数字样式在两者之间有所不同 - 我怀疑这是因为 double
值通常用于基于指数的表示很常见的科学场景,但 decimal
值通常不是。
【讨论】:
是的,我知道。我在问为什么会有这种不同的行为 @giammin:如果您事先这么说会很有帮助-本质上您是在问为什么默认数字格式不同,但您的问题并没有问这个问题。我在答案末尾添加了一段以提出可能的原因。 正确:我修改了我的问题以使其更清楚。 +1为您的答案!这是合理的。也许是从性能的角度来看 @giammin:听起来你实际上有两个问题:1)为什么这两种类型的默认样式不同; 2)你为什么看到奇怪的行为。我不知道后者,但我怀疑它实际上并没有运行你所拥有的代码。我建议您添加额外的诊断行来证明这一点 - 并尝试在控制台应用程序中重现问题。我还建议您在每个帖子中问一个问题...以上是关于Decimal.Parse 和 Double.Parse System.FormatException 不同的行为的主要内容,如果未能解决你的问题,请参考以下文章
C#中decimal.Parse(t70OnlinePrice.Value)保留两位小数
Decimal.Parse() 与 Convert.ToDecimal() [重复]
C# Decimal.parse的问题。有字符串 3.10 如何转换成decimal时不会变成3.1。我需要的是完整的3.10