我正在尝试将字符串转换为5.7303333333e+02
类型decimal
。我试过使用[decimal]::TryParse
,但返回值为假。
是否有类似的方法[datetime]::parseexact
或任何干净的方法来转换这些字符串?还是我将不得不e+02
单独解析并进行数学运算?
我正在尝试将字符串转换为5.7303333333e+02
类型decimal
。我试过使用[decimal]::TryParse
,但返回值为假。
是否有类似的方法[datetime]::parseexact
或任何干净的方法来转换这些字符串?还是我将不得不e+02
单独解析并进行数学运算?
关于什么 :
[int]"5.7303333333e+02"
[decimal]"5.7303333333e+02"
您需要指定NumberStyles.Float
PS C:\> $s = '5.7303333333333333333333333e+02'
PS C:\> $style = [Globalization.NumberStyles]::Float
PS C:\> $culture = [cultureinfo]::GetCultureInfo('en-US')
PS C:\> [decimal]::Parse($s, $style)
573.03333333333333333333333
PS C:\> [decimal]$dec = 0
PS C:\> [decimal]::TryParse($s, $style, $culture, [ref] $dec)
True
PS C:\> $dec
573.03333333333333333333333
或附加d
后缀
PS C:\> Invoke-Expression ($s + 'd')
573.0333333333333333333333333
正如皇帝 XLII 上面评论的那样,[decimal]"5.7303333333e+02"
它实际上不起作用,因为它会通过 double 转换为十进制。尝试添加更多数字,您会立即意识到输出不再正确:
PS C:\> Trace-Command TypeConversion { [decimal]'5.7303333333e+02' } -PSHost
DEBUG: TypeConversion Information: 0 : Converting to decimal.
DEBUG: TypeConversion Information: 0 : Exception converting to decimal: "Input string was not in a correct format.". Converting to decimal passing through double.
DEBUG: TypeConversion Information: 0 : Numeric Conversion through System.Double.
573.03333333
PS C:\> [decimal]'5.7303333333e+02'
573.03333333
PS C:\> [decimal]'5.730333333333333333333333333e+02' # doesn't work
573.033333333333
PS C:\> 5.730333333333333333333333333e+02d # correct value
573.0333333333333333333333333
如您所见,如果我们使用十进制的d
后缀,我们将获得正确的高精度值,所以一个简单的技巧就是生成一个新的 shell 来规范化该值,尽管这显然很慢,或者使用Invoke-Expression
PS C:\> $d = '5.730333333333333333333333333e+02'
PS C:\> [decimal]$(powershell -com ($d + 'd'))
573.0333333333333333333333333
PS C:\> Invoke-Expression ($d + 'd'))
573.0333333333333333333333333
但为什么不起作用TryParse
?原因是因为Decimal.Parse和Decimal.TryParse使用的默认样式是这样的
[ws][sign][digits,]digits[.fractional-digits][ws]
这不允许指数。如果您阅读Parse 的文档,您会看到完整的数字格式是
[ws][$][sign][digits,]digits[.fractional-digits][e[sign]digits][ws]
在哪里
e:
- 'e' 或 'E' 字符,表示该值以指数表示法表示。如果 style 包含标志,则 s 参数可以用指数表示法表示数字
NumberStyles.AllowExponent
。
这意味着您需要如上所述使用NumberStyles.Float
(包括NumberStyles.AllowExponent
)才能使其工作