没有 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 的解决方案,因为它看起来更干净。
我正在尝试从 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 的解决方案,因为它看起来更干净。