我最近偶然发现Decimal.Parse
的一些不直观的行为,我想讨论。案件如下。
我的程序从其他程序获取数字作为字符串,"科学地"格式化(它对我来说是一个黑盒子)。使用Decimal.Parse
解析字符串。
Dim Value As Decimal = Decimal.Parse(StrValue, Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo)
一切都很好,直到它试图解析"1.9721522630525295e-31"
。在此字符串上,Decimal.Parse引发了OverflowException。 "确定,"我想,"让我们试试Double!"
Dim dblValue As Double = Double.Parse(StrValue)
这很好用。种类:结果是0.0000000000000019721522630525295
。 (或:Double.Parse(StrValue).ToString = "1,97215226305253E-15"
)
好的,接下来试试。
Dim dblValue As Double = Double.Parse(StrValue, Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo)
按预期工作,E-31
保持这种状态。
所以,这是我的第一个问题:为什么Double.Parse表现得这样?
编辑按照这种方式"我的意思是给我比预期的数量多16个数量级(E-15
而不是E-31
)。 varocarbas提出的问题是 answer :原因是我的本地小数和千位分隔符设置。 .
中的"1.9721522630525295e-31"
被Double.Parse(StrValue)
视为千位分隔符(即被忽略),因此值为0.0000000000000019721522630525295
。
然后我就像以前一样,将结果转换为十进制。
Dim decValue = CDec(dblValue)
没有例外,但我得到的价值再次是1.9721522630525295E-15
。
在谷歌之后,我了解了Convert.ToDecimal
,其工作正常(...E-31
转换为0
。)
第二个问题:我们应始终使用Convert.ToDecimal
而不是CDec
,还是有一些规则或最佳做法或其他?
所以,毕竟我现在使用以下代码。
If Not Decimal.TryParse(StrValue, Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, _
Value) Then
Value = Convert.ToDecimal(Double.Parse(StrValue, Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo))
End If
我的第3次和最后一次(目前)问题是:这段代码是正确的方法吗?
(规格:Visual Studio 2005,.net 3.5,应用程序编译为32位,Windows语言环境设置为德语。)