删除 powershell 中的前导零

Remove leading zeros in powershell

我有几个字符串并尝试删除它们的前导零。我知道我可以使用 TrimStart() 但如果所有数字都为零,那就错了。

$Test = "00000.22"
$Test = $Test.trimstart('0')

结果是 .22,我期望的是 0.22。我怎样才能实现它?谢谢。

您可以使用类型转换为十进制

$Test = "00000.22"
[decimal]$Test

文本解决方案是使用运算符和正则表达式:

PS> '00000.22' -replace '^0+', '0' 
0.22

^0+ 匹配字符串开头 (^) 的一个或多个 (+) 零,并用 单个 [=66= 替换它们] 零。

如果您还想确保正确处理具有非 0 and/or 整数部分且没有小数部分的数字,请使用 -replace '^0+(?=[^.])'(注意缺少替换操作数,它有效地删除了匹配的内容):

PS> ('00000.22', '0000', '00001.22').ForEach({ $_ -replace '^0+(?=[^.])' })
0.22
0
1.22

正 look-ahead 断言 (?=[^.]) 有效地删除了所有前导零 (^0+) 只要这样的零后面没有跟文字 . ([^.]).

如果你想要像'00000.22'这样的东西变成'.22',即如果你想删除整数部分,如果它恰好是0,正则表达式变得更简单:'^0+(?=.)'


很方便,在大多数情况下可能工作正常,但也有 陷阱 :

  • 您正在将数据类型更改为 [decimal],然后将其转换回字符串 可以生成 culture-specific 表示形式,其中 . 转换为 ,(也就是说,PowerShell 本身经常应用 invariant 文化,always 使用.);例如:

      # Cast to [decimal] using the German culture ('de')
      PS> [System.Threading.Thread]::CurrentThread.CurrentCulture = 'de'; [decimal] '0000.22'
      0,22  # !! Note the "," instead of "."
    
  • 即使 high-precision 数据类型(例如 [decimal] 不太可能出现舍入错误 也是可能的:

      PS> [decimal] '00.99999999999999999999999999999'
      1.0000000000000000000000000000 # !! rounding occurred