【问题标题】:Remove leading zeros in powershell删除powershell中的前导零
【发布时间】:2018-08-13 12:50:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: powershell trim


    【解决方案1】:

    纯粹的文本解决方案是使用-replace 运算符和正则表达式

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

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

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

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

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

    如果您确实希望'00000.22' 之类的内容仅变为'.22',即如果您想删除恰好是0 的组成部分,则正则表达式变为更简单:'^0+(?=.)'


    gms0ulman's answer 很方便,可能在大多数情况下都可以正常工作,但也有陷阱

    • 您将数据类型更改为[decimal],并将其转换回字符串可能会导致. 转换为, 的文化特定表示(也就是说, 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 "."
      
    • 即使对于高精度数据类型(例如 [decimal])不太可能,也可能出现舍入错误

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

    【讨论】:

    • 好点,@MaMazav,谢谢。请参阅我的更新,它使用更简单的正则表达式来实现这一点。
    【解决方案2】:

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

    $Test = "00000.22"
    [decimal]$Test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-10
      • 2015-11-22
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2016-01-15
      • 2018-10-14
      相关资源
      最近更新 更多