Regex для числа с десятичными знаками и разделителем тысяч
Мне нужно регулярное выражение для проверки числа, которое может содержать тысячи разделителей или десятичных знаков с помощью javascript.
Максимальное значение 9,999,999.99
Минимальное значение 0.01
Другие допустимые значения:
11,111
11.1
1,111.11
НЕДЕЙСТВЕННЫЕ значения:
1111
1111,11
,111
111,
Я искал все без радости.
Ответы
Ответ 1
/^\d{1,3}(,\d{3})*(\.\d+)?$/
О минимальном и максимальном значениях... Ну, я бы не сделал это с помощью регулярного выражения, но вы можете добавить вначале lookaheads:
/^(?!0+\.00)(?=.{1,9}(\.|$))\d{1,3}(,\d{3})*(\.\d+)?$/
Примечание: это позволяет 0,999.00
, поэтому вы можете изменить его на:
/^(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?$/
который не допускал бы ведущего 0.
Edit:
Тесты: http://jsfiddle.net/pKsYq/2/
Ответ 2
((\d){1,3})+([,][\d]{3})*([.](\d)*)?
Он работал над несколькими, но я все еще изучаю регулярное выражение.
Логика должна быть 1-3 цифры 0-1 раз, 1 запятая, а затем 3 цифры сколько угодно раз, и одна. за которым следует любое количество цифр 0-1 раз
Ответ 3
Я использовал ниже regrex для следующих повторений:
^(?!0|\.00)[0-9]+(,\d{3})*(.[0-9]{0,2})$
- Не разрешать 0 и .00.
- ',' (тыс. seperator) после трех цифр.
- '' (десятичное число до двух знаков после запятой).
Ответ 4
В недавнем проекте нам нужно было изменить эту версию, чтобы соответствовать международным требованиям. Это то, что мы использовали: ^-?(\d{1,3}(?<tt>\.|\,| ))((\d{3}\k<tt>)*(\d{3}(?!\k<tt>)[\.|\,]))?\d*$
Создание именованной группы (?<tt>\.|\,| )
Позволило нам использовать негативный взгляд вперед (?!\k<tt>)[\.|\,])
Позже, чтобы обеспечить разделитель тысяч и десятичную точки на самом деле разные.
Ответ 5
Во-первых, я хочу указать, что если у вас есть форма, из которой поступают данные, лучшим способом ограничить ввод является использование правильных элементов формы (aka, number field)
<input type="number" name="size" min="0.01" max="9,999,999.99" step="0.01">
Можно ли ввести ",", будет основан на браузере, но браузер всегда будет давать вам значение как фактическое число. (Помните, что все данные формы должны быть проверены/обработаны на стороне сервера. Никогда не доверяйте клиенту)
Во-вторых, я хотел бы расширить другие ответы на более надежное (независимое от платформы)/модифицируемое регулярное выражение.
- Вы должны окружить регулярное выражение символами ^ и $, чтобы убедиться, что вы сопоставляете их со всем числом, а не только с его подмножеством. ex
^<my_regex>$
- Правая часть десятичной части является необязательной, поэтому мы можем поместить ее в необязательную группу
(<regex>)?
- Согласование буквального периода и любой цепочки чисел просто
\.\d+
- Если вы хотите настаивать на последнем номере после того, как десятичное число не равно 0, вы можете использовать
[1-9]
для "ненулевого числа", поэтому \.\d+[1-9]
- Для левой части десятичного числа ведущее число будет отличным от нуля, или число равно нулю. Итак
([1-9]<rest-of-number-regex>|0)
- Первая группа чисел будет 1-3 разряда, поэтому
[1-9]\d{0,2}
- После этого мы должны добавить цифры в 3s так
(,\d{3})*
- Помните? означает необязательный, поэтому, чтобы сделать, необязательно просто
(,?\d{3})*
Объединяя все это
^([1-9]\d{0,2}(,?\d{3})*|0)(\.\d+[1-9])?$
Ответ 6
Формула Tezra не подходит для "1". или "1.0". Для моих целей я допускаю ведущие и конечные нули, а также ведущий + или - знак:
^[-+]?((\d{1,3}(,\d{3})*)|(\d*))(\.|\.\d*)?$