我有几个字符串,并尝试删除它们的前导零.我知道我可以使用TrimStart()但如果所有数字都为零则错了.
$Test = "00000.22"
$Test = $Test.trimstart('0')
Run Code Online (Sandbox Code Playgroud)
结果是.22,我期望的是0.22.我怎样才能实现它?谢谢.
纯文本解决方案是使用-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)| 归档时间: |
|
| 查看次数: |
3136 次 |
| 最近记录: |