如何在 PowerShell 中将 5.7303333333e+02 等字符串转换为十进制?

问题描述 投票:0回答:2

我正在尝试将

5.7303333333e+02
等字符串转换为
decimal
类型。我尝试过使用
[decimal]::TryParse
但返回值是 false。

是否有类似于

[datetime]::parseexact
的方法,或者任何干净的方法来转换这些字符串?或者我是否必须解析出
e+02
并单独进行数学计算?

powershell decimal data-conversion
2个回答
9
投票

怎么样:

[int]"5.7303333333e+02"
[decimal]"5.7303333333e+02"

0
投票

TL;博士:

使用 NumberStyles.Float

Parse
 时需要指定 
TryParse

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

正如皇帝四十二在上面评论

[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.ParseDecimal.TryParse 使用的默认样式是这样的

[ws][sign][digits,]digits[.fractional-digits][ws]

其中不允许使用指数。如果您阅读 Parse 的文档,您会发现完整的数字格式是

[ws][$][sign][digits,]digits[.fractional-digits][e[sign]digits][ws]

[e]
在哪里

  • “e”或“E”字符,表示该值以指数表示法表示。如果 style 包含
    NumberStyles.AllowExponent
    标志,则 s 参数可以用指数表示法表示数字。

这意味着您需要使用上面的

NumberStyles.Float
(包括
NumberStyles.AllowExponent
)才能使其工作

© www.soinside.com 2019 - 2024. All rights reserved.