2015-02-22 2 views
1

Мне нужно регулярное выражение, которое принимает только десятичные числа, до двух десятичных знаков. Я уже пробовал ^\d{1,}(\.\d{2})?$', но я не хочу, чтобы он использовал необязательную группу, потому что это позволит пройти 1. Если вы выберете дополнительную группу, она не позволит передать 1.00.RegEx для десятичного числа с точностью до двух

мой код:

[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 

Invalid:

1 
1.000000 

Единственное, что я думаю, что будет решать проблему изменения переменной $bookPrice в строку, но я не хочу тратить время на преобразование его в двойное.

ответ

1

Я думаю, вы задаете неправильный вопрос здесь, потому что как только вы приводите в два раза, ваше регулярное выражение никогда не будет работать на «1,00»

При преобразовании строки в [double]$bookPrice, то нули исчезают. Двойной не хранит бессмысленные цифры. Если пользователь вводит 1.00, переменная $bookPrice равна «1», и если пользователь вводит 1.10, это просто «1,1» - избыточные конечные нули не будут отображаться, когда вы делаете -match против двойного (вы бросаете двойной назад к строке).

Конечно, если все, что вы беспокоитесь о том, строковое представление числа, то вы можете указать выходные данные форматирования, как этот "{0:n2}" -f $bookPrice, чтобы гарантировать, что вы всегда будете иметь два и только два знака после запятой ...

0

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

Написано с питоном в виду, но проверить: https://regex101.com/r/lT8xD9/1 для объяснения того, что происходит. Я думаю, что он должен делать то, что вы ищете, но я тоже вроде как новый.

Смежные вопросы