没有 CurrencyGroupSeparator 的舍入

Rounding without CurrencyGroupSeparator

我正在尝试从 Powershell 向 Nagios 输出一个值。我想要一个只有 .对于小数,不是 1000 和 1000000 的分隔符,即使它是尾随零也总是 5 位小数。

起初我有这个:

$DiskStruct.AvgDiskReadQueueValue = '{0:N5}' -f ($AvgObjDiskReadQueueValues.average)

但这导致: 2205.06040082681 转换为: 2,205.06040

然后我尝试了

$DiskStruct.AvgDiskReadQueueValue = [decimal][math]::Round($AvgObjDiskReadQueueValues.average, 5)

但这不知何故导致 Powershell 脚本有时以科学记数法输出。而且它没有显示尾随零。 结果 => Read/s = 2205.0604

那么我该怎么做才能始终输出 5 位小数,但不显示任何货币组分隔符?

(Get-Culture).NumberFormat.CurrencyGroupSeparator

我需要的结果是 2205.06040。

我最初是作为评论发布的,但我想这种可能性并不是很明显,所以在这里找到答案可能会有用。

{0:Nx} 将数字转换为可以转换回任何合适的数字类型的字符串。因为你想保留小数:

[decimal]('{0:N5}' -f ($AvgObjDiskReadQueueValues.average))

就是你想要的。


要使此解决方案与文化无关,您可以使用 a little trick:

$OldCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture
[System.Threading.Thread]::CurrentThread.CurrentCulture = "en-US"

# Do culture-sensitive stuff here. 
# (As long as it doesn't execute in a different thread.)
[decimal]('{0:N5}' -f ($AvgObjDiskReadQueueValues.average))

[System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture

我用这个解决了 $Separator = (Get-Culture).NumberFormat.CurrencyGroupSeparator $DiskStruct.AvgDiskSecReadValue = ('{0:N5}' -f ([math]::Round(($AvgObjDiskSecReadValues.average * 1000), 5))).replace("$Separator",'')

通过首先询问分隔符然后什么都不替换,我得到了我想要的。 将其改回 Alexander 的解决方案,因为它看起来更干净。