计算给定小数的小数位数

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

如何在Powershell中计算给定小数的小数位数?

$a = 0.0001
$b = 0.000001

$a强制转换为字符串并返回$a.Length的结果为6 ...我需要4。

我以为会有一个十进制或数学函数,但我还没有找到它,弄乱字符串似乎不太优雅。

powershell
2个回答
2
投票
也许有更好的数学方法,但我会发现像这样的小数位:

$a = 0.0001 $decimalPlaces = ($a.ToString() -split '\.')[-1].Length

基本上,将字符串拆分为.字符,并获取数组中最后一个字符串的长度。

如果您想要一种文化安全的方法来执行此操作,请选择一种替代方法:

$cultureDecimal = [System.Threading.Thread]::CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator $a = 0.0001 $decimalPlaces = ($a.ToString().Split($cultureDecimal))[-1].Length

在这种情况下,我选择了[string].Split方法,因为我们不想担心是否先检查是否需要转义表达式(.是正则表达式中的特殊标记,但,不是在量词之外)。

0
投票
提供简洁且

文化不变性解决方案:

$a = 0.0001 ("$a" -replace '.+\.').Length # -> 4

Caveat:此解决方案依赖于[double]编号的默认字符串表示形式

,该编号不必与原始输入格式匹配;因此,该格式不适用。例如,.0100稍后进行字符串化时,将变为'0.01'
  • "$a",使用

    可扩展字符串

(PowerShell的字符串插值)创建数字的culture-invariant字符串表示形式,以确保字符串表示形式使用.作为小数点。
  • 实际上,PowerShell在后台调用$a.ToString([cultureinfo]::InvariantCulture)
  • 相反,.ToString()(无参数)应用

    current

文化的规则,在某些文化中,将,-而不是.-用作小数点。
  • Caveat

  • :如果仅将$a用作-replace的LHS,则$a被[[implicitly字符串化,在这种情况下,您-好奇-得到了文化-敏感] >行为,例如.ToString()[-replace '.+\.有效地从输入字符串中删除所有字符,直到小数点,包括小数点,.Length对结果字符串中的字符进行计数-小数位数。
    © www.soinside.com 2019 - 2024. All rights reserved.