Регулярное выражение - стоимость предмета - PullRequest
2 голосов
/ 12 ноября 2010

Какое регулярное выражение для проверки стоимости предоставлено правильно:

  • Число должно быть больше или равно 0,01
  • Число должно быть меньше или равно 99,99

Возможные совпадения:

9 |23,3 |25,69

Не допускается:

  1. |2.

Ответы [ 6 ]

2 голосов
/ 12 ноября 2010

Конечно, правильным способом было бы взять предоставленную строку, преобразовать ее в число (отлавливать ошибки, если это не анализируемое число), а затем сравнить это с действительными значениями.

Если это имеет в качестве регулярного выражения, это, конечно, возможно, но безобразно:

^(?:[1-9][0-9]?(?:\.[0-9]{1,2})?|0?.0[1-9]|0?.[1-9][0-9]?)$

Объяснение:

^                   # start of string
(?:                 # either match
 [1-9][0-9]?        # a number between 1 and 99
 (?:\.[0-9]{1,2})?  # optionally followed by a decimal point and up to two digits
|                   # or
 0?.0[1-9]          # a number between 0.01 and 0.09 (optionally without leading 0)
|                   # or
 0?.[1-9][0-9]?     # a number between 0.1 and 0.99
)                   # end of alternation
$                   # end of string

Конечно, в большинстве регулярных выраженийна диалектах вы можете использовать \d вместо [0-9] без изменения значения, но я думаю, что в этом случае придерживаться более длинной версии помогает удобочитаемость.

В Ruby, если ваша входная строка никогда не содержитсимвол новой строки:

if subject =~ /^(?:[1-9][0-9]?(?:\.[0-9]{1,2})?|0?.0[1-9]|0?.[1-9][0-9]?)$/
    # Successful match
else
    # Match attempt failed
end

Поскольку вы заботитесь о количестве значащих цифр, другим решением будет сначала проверить, выглядит ли ввод как число, и если он проходит этот тест, преобразовать его в число с плавающей точкой и проверитьесли он находится в диапазоне.

^(\d{1,2}|\d{0,2}\.\d{1,2})$

будет соответствовать любому числу (целое или десятичное с точностью до двух цифр после запятой) в диапазоне от 0 до 99,99.Тогда вам просто нужно проверить, является ли число> = 0,01.Преимущество этого подхода заключается в том, что вы можете легко расширить диапазон цифр, разрешенных до / после десятичной точки, если изменяются требования к действительным числам, а затем соответствующим образом настроить проверку значения.

2 голосов
/ 12 ноября 2010

Решение с использованием регулярных выражений будет трудно поддерживать, поскольку это очень странный и не интуитивно понятный способ решения проблемы. Всем, кто читает ваш код (включая вас за пару недель), будет трудно понять, какова цель проверки.

Тем не менее, предполагая, что значения 0,00 - 99,99 действительны, регулярное выражение может быть

^\d{0,2}(\.\d\d?)?$

Предполагая 0,01 - 99,99, все немного сложнее:

^0{0,2}(\.(0[1-9]|[1-9]\d?))?|\d{0,2}(\.\d\d)?$

И не заводите меня на 0,02 - 99,98 ...: -)

Так что, в принципе, не делайте этого. Преобразуйте строку в числовое значение, а затем выполните проверку с регулярным интервалом.

2 голосов
/ 12 ноября 2010

Я не уверен, что вам нужно делать это с помощью регулярного выражения, почему бы вам просто не разбить строку на '|'в массив и проверьте, что каждый элемент в массиве больше 0,01 и меньше 99,99

0 голосов
/ 13 ноября 2010

Поскольку вы находитесь в Rails, вам лучше использовать validates_numericality_of в вашей модели:

validates_numericality_of :cost, :greater_than_or_equal_to => 0.01, 
                                 :less_than_or_equal_to => 0.99

Чтобы предотвратить дробные пенни, используйте это вместе с validates_format_of:

validates_format_of :cost, :with => /\A\d*(\.\d{1,2})?\Z/

Это усиливает силу каждой проверки.

0 голосов
/ 12 ноября 2010

Это не самый лучший, но работает

(0\.01|0\.02|0\.03| ... |99\.98|99\.99)
0 голосов
/ 12 ноября 2010

try

^\d{1,2}(\.\d{1,2})?$  

проверяет, есть ли 1 или 2 цифры, и, если необходимо, если есть точка, проверяет, есть ли 1 или 2 цифры после точки.на комментарии вашего вопроса: ничто не говорит против проверки формата перед отправкой запроса на сервер или что-то еще.проверки дальности могут быть сделаны где-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...