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*)?$