Простое регулярное выражение для десятичной дроби с точностью до 2 - PullRequest
251 голосов
/ 21 ноября 2008

Что такое регулярное выражение для десятичной дроби с точностью до 2?

Допустимые примеры :

123.12
2
56754
92929292929292.12
0.21
3.1

Недопустимые примеры:

12.1232
2.23332
e666.76

Десятичная точка может быть необязательной, также могут быть включены целые числа.

Ответы [ 17 ]

370 голосов
/ 21 ноября 2008

Действительные токены регулярного выражения зависят от реализации. Самая общая форма, о которой я знаю, была бы:

[0-9]+(\.[0-9][0-9]?)?

Самый компактный:

\d+(\.\d{1,2})?

Оба предполагают, что вы должны иметь как минимум одну цифру до и одну после десятичного знака.

Чтобы потребовать, чтобы вся строка была числом этой формы, оберните выражение в начальный и конечный теги, например (в форме Perl):

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

ДОБАВЛЕНО: Завершение дробной части в ()? сделать это необязательным. Имейте в виду, что это исключает такие формы, как «12». В том числе это было бы больше похоже на ^\d+\.?\d{0,2}$.

Добавлено: Используйте этот формат ^\d{1,6}(\.\d{1,2})?$, чтобы остановить повторение и задать ограничение для всей части десятичного значения.

251 голосов
/ 21 ноября 2008
^[0-9]+(\.[0-9]{1,2})?$

И поскольку регулярные выражения ужасно читать, а тем более понимать, вот подробный эквивалент:

^                         # Start of string
 [0-9]+                   # Require one or more numbers
       (                  # Begin optional group
        \.                # Point must be escaped or it is treated as "any character"
          [0-9]{1,2}      # One or two numbers
                    )?    # End group--signify that it's optional with "?"
                      $   # End of string

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

Кроме того, вот простой скрипт Python, который я использовал для его проверки:

import re
deci_num_checker = re.compile(r"""^[0-9]+(\.[0-9]{1,2})?$""")

valid = ["123.12", "2", "56754", "92929292929292.12", "0.21", "3.1"]
invalid = ["12.1232", "2.23332", "e666.76"]

assert len([deci_num_checker.match(x) != None for x in valid]) == len(valid)
assert [deci_num_checker.match(x) == None for x in invalid].count(False) == 0
19 голосов
/ 18 июня 2010

Чтобы включить необязательный знак минуса и запретить такие числа, как 015 (что можно принять за восьмеричные числа), напишите:

-?(0|([1-9]\d*))(\.\d+)?
13 голосов
/ 19 января 2012

Для чисел, у которых нет разделителя тысяч, мне нравится это простое, компактное регулярное выражение:

\d+(\.\d{2})?|\.\d{2}

или, не ограничиваясь точностью 2:

\d+(\.\d*)?|\.\d+

Последний соответствует
1
100
100.
100,74
100,7
0,7
0,7
0,72

И это не соответствует пустой строке (как \ d *.? \ D * будет)

7 голосов
/ 26 августа 2011

Я использую это до двух десятичных знаков:
(^(\+|\-)(0|([1-9][0-9]*))(\.[0-9]{1,2})?$)|(^(0{0,1}|([1-9][0-9]*))(\.[0-9]{1,2})?$) проходит:
+0,25
0.25
10,25
+ 0,25

не проходит:
-.25
01,25
1.
1,256

7 голосов
/ 08 сентября 2012
^[0-9]+(\.([0-9]{1,2})?)?$

сделает такие вещи как 12. принятыми. Это не то, что принято, но если вам нужно быть «гибким», это один из способов. И, конечно же, [0-9] можно заменить на \d, но я думаю, что так будет удобнее читать.

5 голосов
/ 14 июня 2011

Попробуйте это

 (\\+|-)?([0-9]+(\\.[0-9]+))

Это позволит также положительные и отрицательные признаки.

3 голосов
/ 05 апреля 2018

Основной ответ НЕПРАВИЛЬ, потому что он действителен 5. или 5, входные данные

этот код обрабатывает его (но в моем примере запрещены отрицательные числа):

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

Результаты приведены ниже:

true => "0" / true => "0.00" / true => "0.0" / true => "0,00" / true => "0,0" / true => "1,2" true => "1.1" / true => "1" / true => "100" true => "100.00" / true => "100.0" / true => "1.11" / true => "1,11" / false => "-5" / false => "-0.00" / true => "101" / false => "0.00.0" / true => "0.000" / true => "000.25" / false => ".25" / true => "100.01" / true => "100.2" / true => "00" / false => "5." / false => "6," / true => "82" / true => "81,3" / true => "7" / true => "7.654"

2 голосов
/ 08 июня 2012

В общем, то есть неограниченное количество знаков после запятой:

^-?(([1-9]\d*)|0)(.0*[1-9](0*[1-9])*)?$.

2 голосов
/ 13 июля 2011
preg_match("/^-?\d+[\.]?\d\d$/", $sum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...