如何在PowerShell程序中校验输入值处于-9至9的整数/小数范围?
解决PowerShell中输入值的范围校验问题
首先来说说你原来的[-9+9]正则为什么会失效:这个写法是字符集的错误用法——正则里的[]表示匹配其中任意单个字符,[-9]实际是匹配-或者9(因为-在字符集里如果放在开头/结尾或者转义才是普通字符,否则表示范围,但这里-在9前面,并不是有效的范围定义),后面的+9也是匹配+或者9,所以这个正则只能匹配-、+、9这三个单个字符,完全起不到范围校验的作用,这就是为什么很多有效值(比如3.5、-2)匹配不上。
要同时校验格式是整数/小数且范围在-9到9之间,更可靠的方式是先把输入转换成数值类型,再做范围判断,比纯正则处理要简单不易出错。下面是修改后的代码及解释:
修改后的核心校验逻辑
# 先尝试把输入转换成double类型,同时校验格式是否合法 if ([double]::TryParse($inputpecentw1.Text, [ref]$null) -and ([double]$inputpecentw1.Text -ge -9 -and [double]$inputpecentw1.Text -le 9)) { $newpercent1 = $inputpecentw1.Text # 下面是你原来的XML修改逻辑,保持不变 [xml](Get-Content $file1.text) | ForEach-Object { $_.SelectNodes('//FieldCostOptions/IncreaseCost') | ForEach-Object { $_.SetAttribute("Percent", $newpercent1) } $_.Save("$PSScriptRoot\MIK_Autokontinent.xml") } # 重新读取XML并更新输入框内容 $inputpecentw1.Text = ([xml](Get-Content $file1.text)).SelectNodes('//FieldCostOptions/IncreaseCost').GetAttribute("Percent") | Out-String } else { # 格式错误或超出范围时,重置输入框为XML中的原有值 $inputpecentw1.Text = ([xml](Get-Content $file1.text)).SelectNodes('//FieldCostOptions/IncreaseCost').GetAttribute("Percent") | Out-String }
关键改进点:
- 格式校验:用
[double]::TryParse判断输入是否是有效的数值(整数/小数都支持),比正则更准确,能避免正则漏判或误判的情况。 - 范围校验:转换为
double类型后,直接用-ge(大于等于)和-le(小于等于)判断是否在-9到9之间,逻辑清晰易懂。 - 简化XML读取:把重复的XML读取逻辑简化,避免重复代码。
如果你一定要用正则实现(不推荐,因为范围判断正则较复杂)
如果坚持用正则同时处理格式和范围,你可以用这个正则(但注意:正则只能做字符串层面的匹配,对于非常用格式的小数可能有疏漏):
$inputpecentw1.Text -match '^(-?(?:9(?:\.0+)?|[1-8](?:\.\d+)?|0(?:\.\d+)?))$'
这个正则的逻辑是:
- 匹配负号(可选)
- 然后匹配:
- 9(可以带
.000...的小数部分) - 1到8之间的整数(可以带任意小数部分)
- 0(可以带任意小数部分)
但还是推荐用数值转换的方式,更稳健。
- 9(可以带
内容的提问来源于stack exchange,提问作者danrather
相关产品推荐
相关产品推荐

