Регулярное выражение для плавающей запятой?

Я пытаюсь написать RegEx для проверки числа с плавающей запятой. Вот что мне удалось до сих пор:

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

Номер действителен, если:

Положительный или отрицательныйМакс 2 цифры (десятки или сотни)Сотая цифра не может 0 (только 1-9)Масштаб не более 1Десятичное значение может быть 0 или 5 или ни одного вообще

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

1,5-1,517,515-330,5

Эти числа будут недействительными, например:

1,573041,517,59915-1,5605,0
 Dave08 февр. 2012 г., 02:58
Почему вы налагаете искусственные ограничения на то, что представляет собой поплавок?
 Mark Byers02 июн. 2012 г., 22:49
Можете ли вы описать, какие другие строки должны соответствовать вашему регулярному выражению - и, что не менее важно, - не должны совпадать. Если вы не можете описать это словами, приведите ряд различных примеров, которые охватывают как общие случаи, так и все крайние случаи, которые вы можете придумать. Для каждого ввода прямо укажите, хотите ли вы, чтобы оно совпадало или не совпадало.
 David Grayson08 февр. 2012 г., 03:00
Это на самом деле не вопрос. Какие требования вы придерживаетесь? Не могли бы вы предоставить какой-то код rspec, который не проходит, или хотя бы несколько примеров, когда ваш текущий оператор дает неправильный ответ? Пожалуйста, расскажите нам все, что вы знаете, вместо того, чтобы угадывать
 alex08 февр. 2012 г., 02:54
Является ли регулярное выражение правильным инструментом для этого?
 ggreiner08 февр. 2012 г., 02:53
.5 будет действительным?

Ответы на вопрос(5)

/^[-+]?\d{0,2}(\.[05])?(?!\d)$/

Значение либо положительное, либо отрицательное

величина меньше 100. в диапазоне(-99.5 to 99.5)

Десятичное значение.0 или же.5 или отсутствует (другими словами,.0 или же.5или отсутствует)

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

1.5 -1.5 17.5 15 -3 30.5 -10.0 99.5

Эти числа будут недействительными, например:

1.57 3041.5 17.59 915 -1.56 05.0 99.6

http://www.regular-expressions.info/floatingpoint.html

Это сказало,

{1,1} эквивалентно{1} что равносильно тому, чтобы не ставить его вообще, так что вы можете удалить егоЕсли вы хотите убедиться, что0.5xyz не проходит, затем добавьте$ в конце

С учетом вышеуказанных изменений это будет выглядеть так:/^[-+]?[1-9]\d{0,2}(\.\d)?$/

Решение Вопроса

итываться, а затем вы добавите еще две - которые теперь позволят использовать трехзначные числа, такие как915, Чтобы решить это с помощью регулярного выражения (с вашими тестами):

^[+-]?(?:(?!0)\d{1,2}|0)(?:\.[05])?$

Я пользуюсь негативным взглядом(?!0) чтобы убедиться, что первая цифра не является нулем, просто введите требуемое количество цифр. Это также позволяет0.5 и подобное через|0 дизъюнкции. Если хочешь.5Буду так:

^[+-]?(?!0)\d{,2}(?:\.[05])?$

Если вы хотите запретить3.0 (разрешено вашими правилами) и разрешено только3 (как вы подразумеваете в примерах), замените последнюю часть:

^[+-]?(?:(?!0)\d{1,2}|0)(?:\.5)?$

Тем не менее, это гораздо менее читабельно, чем приятно @ АркуFloat(number); используйте регулярные выражения, если они вам действительно нужны.

Регулярное выражение для плавающей запятой?

Это регулярное выражение будет работать:

 ^[+-]?([1-9][0-9]?|0)(\.[05])?$

Float(number) (ловить исключения для обнаружения ошибок разбора), а затем проверять число с плавающей запятой? Это будет легче для некоторых свойств, чем написание регулярного выражения. Если вам нужно принудительно использовать подмножество синтаксиса, принятого Ruby (почему?), Проверяйте только эту часть с помощью регулярного выражения.

 Aditya Sanghi03 февр. 2016 г., 10:07
да спасение для ArgumentError сработало. Спасибо
 Aditya Sanghi01 февр. 2016 г., 12:30
Не могли бы вы рассказать, как мы можем перехватить исключение, которое возникает, когда что-то вроде Float ("xyz") генерирует исключение
 Arkku01 февр. 2016 г., 13:23
@AdityaSanghibegin/rescue как обычно, краткий тест вirb показывает, чтоFloat("xyz") бросаетArgumentError.

Ваш ответ на вопрос