删除powershell中的前导零

Ive*_*ang 6 powershell trim

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

$Test = "00000.22"
$Test = $Test.trimstart('0')
Run Code Online (Sandbox Code Playgroud)

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

gms*_*man 5

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

$Test = "00000.22"
[decimal]$Test
Run Code Online (Sandbox Code Playgroud)


mkl*_*nt0 5

文本解决方案是使用-replace带有正则表达式的运算符:

PS> '00000.22' -replace '^0+', '0' 
0.22
Run Code Online (Sandbox Code Playgroud)

^0+匹配字符串+开头 ( ^)处的一个或多个 ( ) 零,并将它们替换为单个零。

如果您还想确保整数部分不是0和/或没有小数部分的数字得到正确处理,请使用 -replace '^0+(?=[^.])'(注意没有替换操作数,这有效地删除了匹配的内容):

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

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

如果你确实想要像'00000.22'just那样的东西'.22',即如果你想删除它的组成部分,如果它碰巧是0,正则表达式会变得更简单:'^0+(?=.)'


gms0ulman 的回答很方便,并且在大多数情况下可能工作正常,但存在缺陷

  • 您正在将数据类型更改为[decimal],并将其转换回字符串可能会导致.转换为特定于文化的表示形式,(也就是说,PowerShell 本身通常应用不变文化,它总是使用.);例如:

    # Cast to [decimal] using the German culture ('de')
    PS> [System.Threading.Thread]::CurrentThread.CurrentCulture = 'de'; [decimal] '0000.22'
    0,22  # !! Note the "," instead of "."
    
    Run Code Online (Sandbox Code Playgroud)
  • 尽管使用高精度数据类型(例如 )不太可能,但可能出现[decimal]舍入错误:

    PS> [decimal] '00.99999999999999999999999999999'
    1.0000000000000000000000000000 # !! rounding occurred
    
    Run Code Online (Sandbox Code Playgroud)