【发布时间】:2018-08-13 12:50:27
【问题描述】:
我有几个字符串并尝试删除它们的前导零。我知道我可以使用TrimStart(),但如果所有数字都为零,那就错了。
$Test = "00000.22"
$Test = $Test.trimstart('0')
结果是 0.22,而我期望的是 0.22。我怎样才能实现它?谢谢。
【问题讨论】:
标签: powershell trim
我有几个字符串并尝试删除它们的前导零。我知道我可以使用TrimStart(),但如果所有数字都为零,那就错了。
$Test = "00000.22"
$Test = $Test.trimstart('0')
结果是 0.22,而我期望的是 0.22。我怎样才能实现它?谢谢。
【问题讨论】:
标签: powershell trim
纯粹的文本解决方案是使用-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
【讨论】:
您可以使用类型转换为十进制
$Test = "00000.22"
[decimal]$Test
【讨论】: