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

时间:2013-06-06 16:06:58

标签: powershell

我正在尝试将5.7303333333e+02等字符串转换为十进制类型。我尝试过使用[decimal]::TryParse,但返回值为false。有没有类似[datetime]::parseexact的方法,或者转换这些字符串的任何干净方法?或者我是否必须解析e+02并单独进行数学计算?

2 个答案:

答案 0 :(得分:8)

怎么样:

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

答案 1 :(得分:0)

TL; DR:

您需要指定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]::TryParse($s, $style, $culture, [ref] $dec)
True
PS C:\> $dec
573.03333333333333333333333

Emperor XLII commented above一样, [decimal]"5.7303333333e+02"实际上不起作用,因为它将 通过双精度转换为十进制 。尝试添加更多数字,您会立即意识到输出不再正确:

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 suffix用作小数,我们将获得正确的高精度值,因此,一个简单的技巧只是生成一个新的shell来标准化该值,尽管这显然会很慢

PS C:\> $d = '5.730333333333333333333333333e+02'
PS C:\> [decimal]$(powershell -com ($d + 'd'))
573.0333333333333333333333333

但是TryParse为什么不起作用?原因是因为Decimal.ParseDecimal.TryParse使用的默认样式是这样的

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

不允许使用指数。如果您阅读Parse's documentation,将会看到全数字格式为

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

哪里

e:

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

这意味着您需要如上所述使用NumberStyles.Float(其中包括NumberStyles.AllowExponent)以使其起作用