Подтвердить что ты не робот

Проверка валюты Regex

Мне нужна помощь для валютного регулярного выражения в функции jQuery.

  • Он по выбору позволяет знаку "$" только один раз в начале.
  • Он позволяет запятую в качестве разделителя цифровых групп, но не в начале или в конце.
  • Он позволяет всего 2 цифры округлять после десятичной точки.
  • Он позволяет использовать только одну десятичную точку, а не в начале или конце.

Действителен:

$1,530,602.24
1,530,602.24

Неверно:

$1,666.24$
,1,666,88,
1.6.66,6
.1555.

Я попробовал /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i; он отлично работает, за исключением того, что он соответствует 1,6,999.

4b9b3361

Ответ 1

RegEx

// Requires a decimal and commas
^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?\.[0-9]{1,2}$

// Allows a decimal, requires commas
(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?(\.[0-9]{1,2})?$

// Decimal and commas optional
(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|[0-9]+)?(\.[0-9]{1,2})?$

// Decimals required, commas optional
^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|[0-9]+)?\.[0-9]{1,2}$

// *Requires/allows X here also implies "used correctly"

Распределение RegEx

  • Если десятичные знаки являются необязательными, а число может начинаться с десятичного числа, нам нужно убедиться, что вход не пуст: (?=.)
  • Может или не может начинаться со знака доллара (я полагаю, отрицательные значения недействительны): ^\$?
    • Следуйте этому с помощью -?, чтобы разрешить отрицательные числа
  • Начинается с 1-3 номеров: [1-9][0-9]{0,2}
    • Может быть почти ([0-9]{1,3}), но это позволит "0,123"
    • Одно исключение может начинаться с 0 в случае "$ 0.50" или "0.50": |0
  • Любое количество трехзначных чисел, разделенных запятой: (,[0-9]{3})*
    • Удалите ? до \., если вы хотите запретить число, начинающееся с "." или "$."
  • Требует или разрешает десятичную (одну или две цифры): \.[0-9]{1,2} или (\.[0-9]{1,2})? соответственно
  • Завершить с $ (unescaped), чтобы убедиться, что после допустимого числа ничего нет (например, $1,000.00b)

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

// The return will either be your match or null if not found
yourNumber.match(/(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?(\.[0-9]{1,2})?$/);

// For just a true/false response
!!yourNumber.match(/(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?(\.[0-9]{1,2})?$/);

Пример основного использования

Демо с тестовыми случаями

var tests = [
    "$1,530,602.24", "1,530,602.24", "$1,666.24$", ",1,666,88,", "1.6.66,6", ".1555."
];

var regex = /(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?(\.[0-9]{1,2})?$/;

for (i = 0; i < tests.length; i++) { 
  console.log(tests[i] + ' // ' + regex.test(tests[i]));
  document.write(tests[i] + ' // ' + regex.test(tests[i]) + '<br/>');
}

Ответ 2

Вот регулярное выражение, которое должно достичь этого для вас.

Начало должно быть числовым или знаком $. Может быть любое число цифр с запятыми, но оно должно начинаться и заканчиваться цифрой. В конце строки может быть указана десятичная точка с двумя цифрами после нее.

var your_input = "$1,000,000.00";
var valid_dollar_amt_regex = /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i;

if(valid_dollar_amt_regex.test(your_input))
    alert("Valid!");

Или используйте эту функцию

function validate_money(i) {
    var valid_dollar_amt_regex = /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i;
    return valid_dollar_amt_regex.test(i);
}

Посмотрите, как работает: http://jsfiddle.net/znuJf/