我正在尝试将5.7303333333e+02
等字符串转换为十进制类型。我尝试过使用[decimal]::TryParse
,但返回值为false。有没有类似[datetime]::parseexact
的方法,或者转换这些字符串的任何干净方法?或者我是否必须解析e+02
并单独进行数学计算?
答案 0 :(得分:8)
怎么样:
[int]"5.7303333333e+02"
[decimal]"5.7303333333e+02"
答案 1 :(得分:0)
您需要指定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.Parse和Decimal.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
)以使其起作用