精度为 2 的十进制数的正则表达式

RegEx for decimal number with precision of two

我需要一个只接受小数的正则表达式,最多两位小数。 我已经尝试过 ^\d{1,}(\.\d{2})?$' 但我不希望它使用可选组,因为这将允许 1 通过。如果去掉optional组,将不允许1.00通过

我的代码:

[double]$bookPrice = read-host "Enter book price "
if($bookPrice -notmatch '^\d{1,}(\.\d{2})?$'){
        [console]::beep(500,300)
        Write-Host "invalid"
}

有效:

1.00
1.12

无效:

1
1.000000

我认为唯一可以解决问题的方法是将变量 $bookPrice 更改为字符串,但我不想浪费一行将其转换回双精度。

[\d]*?[.][\d]{2}(?=[\s\W])

考虑到 python 编写,但请查看:https://regex101.com/r/lT8xD9/1 以了解正在发生的事情。我认为它应该可以满足您的需求,但我对此也很陌生。

我认为你在这里问错了问题,因为一旦你转换为 double,你的正则表达式就永远不会在“1.00”上工作

当您将字符串转换为 [double]$bookPrice 时,尾随零消失。 double 不存储无意义的数字。如果用户键入 1.00,则 $bookPrice 变量只是“1”,如果用户键入 1.10,则它只是“1.1”——当您这样做时,多余的尾随零不会出现- 匹配双精度(你正在将双精度转换回字符串)。

当然,如果您只关心数字的字符串表示形式,那么您可以像这样指定输出格式 "{0:n2}" -f $bookPrice 以保证您始终有两位且只有两位小数...