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

271

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

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

123.12
2
56754
92929292929292.12
0.21
3.1

Неверные примеры:

12.1232
2.23332
e666.76

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

user39221
источник
1
Связанный: для десятичного с разделителем тысячных, см. Stackoverflow.com/questions/16148034/…
Yeo
1
Лучший ответ здесь: stackoverflow.com/a/39399503/715269
Гангнус

Ответы:

398

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

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

Более компактный:

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

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

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

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

Чтобы сопоставить числа без первой цифры перед десятичной дробью ( .12) и целыми числами, имеющими конечный период ( 12.), исключая ввод одного периода ( .), попробуйте следующее:

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

добавленной

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

добавленной

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

DocMax
источник
4
Математически я думаю, что число точности 2 всегда должно иметь два знака после запятой, даже если последний равен нулю. Это основано на моем опыте со значительными цифрами, так что это может быть неправильно, но вы на самом деле не знаете, если 1,7 - 1,70 или любое число от 1,70 до 1,74.
paxdiablo
Спасибо! Было именно то, что мне было нужно :) +1
alex
6
это соответствует 0001.00: /
Redben
2
Добавлено '-?' в этом ^ \ d + (\. \ d {1,2})? $ ===> ^ -? \ d + (\. \ d {1,2})? $ для поддержки -ve
Мурали Муругесан
1
@BimalDas, вы можете поддерживать негативы, используя префикс перед -?, как в -?\d+(\.\d{1,2})?. Я не включал негативы и не начинал с десятичной точки, поскольку их не было в вопросе OP, хотя они, безусловно, действительны для более общего числового формата. Поток комментариев здесь дает несколько способов обработать ".21".
DocMax
276
^[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
DBR
источник
Я хочу, чтобы до десятичного числа было не более 3 цифр, попробовал вот так безуспешно ^ ([0-9] {0,3}) + (\. [0-9] {1,2})? $
Raghurocks
3
@Raghurocks Удалить +после первого закрытия парен,^([0-9]{0,3})(\.[0-9]{1,2})?$
дбр
Для пользователей Java: десятичное число не должно быть экранировано.
3
@Gracchus Ты уверен? Вероятно, он должен быть \\.вместо, \.потому что .будет выглядеть так, как будто он работает, но соответствует любому символу (не только десятичному разряду). Например, и то 1z23и другое 1.23можно считать действительным, если вы не
избежите
@dbr Может быть, так и должно быть. Ява только что жаловалась на неправильное побег. Убрав это "исправил" (заткнись), лол. У меня еще не было возможности полностью проверить это.
20

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

-?(0|([1-9]\d*))(\.\d+)?
Кароль Беньковски
источник
Это позволяет альфа до десятичного для меня. Позволяет X.25
BengalTigger
1
Это не ограничивает количество знаков после запятой до 2.
Дауд ибн Карим
13

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

\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

Я использую этот срок до двух знаков после запятой:
(^(\+|\-)(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

разочарованный пользователь регулярного выражения
источник
Это также передает пустое значение.
BengalTigger
7
^[0-9]+(\.([0-9]{1,2})?)?$

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

BSharper
источник
5

Попробуй это

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

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

Android
источник
3

Основной ответ НЕПРАВИЛЬНЫЙ, потому что он действителен 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 => "

Вивьен Пипо
источник
2

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

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

SK9
источник
1

Не нужно брать eв e666.76во внимание?

С участием

(e|0-9)\d*\d.\d{1,2)
spacemonkeys
источник
Нет, это было бы за рамками проекта! спасибо, хотя, это удобно :)
user39221
1

добавив мой ответ тоже, кто-то может найти его полезным или может быть правильным мой тоже.

function getInteger(int){
  var regx = /^[-+]?[\d.]+$/g;
  return regx.test(int);
}


alert(getInteger('-11.11'));
СТАЛИ
источник
1

Это работало со мной:

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

Группа 1 - ваш номер с плавающей точкой, а группа 2 - только дробь.

Shady Sherif
источник
1

Я попробовал один с моим проектом. Это позволяет номера со + | -знаками, а также.

/^(\+|-)?[0-9]{0,}((\.){1}[0-9]{1,}){0,1}$/
Premanshu
источник
0

Chrome 56 не принимает этот тип шаблонов (Chrome 56 принимает 11.11. Дополнительный.) С номером типа, используйте тип в качестве текста как прогресс.

rajesh_kw
источник
0

Это позволит десятичную с возведением в степень и до 2 цифр,

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

демонстрация

Nambi_0915
источник
Это не соответствует ни целому числу, ни1.2e-10
Тото
Да, спасибо за ваше исправление. Я думал, что это только для десятичных чисел
Nambi_0915
([0-9]+)?лучше написано \d*. Теперь это не совпадает 10e3. И ОП хочет сопоставить до 2 цифр.
Тото
-1
 function DecimalNumberValidation() {
        var amounttext = ;
            if (!(/^[-+]?\d*\.?\d*$/.test(document.getElementById('txtRemittanceNumber').value))){
            alert('Please enter only numbers into amount textbox.')
            }
            else
            {
            alert('Right Number');
            }
    }

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

Спасибо... :)

Бхану Пратап
источник