Проверка валюты 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
,
2 ответа
RegEx
// Requires a decimal and commas
^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?\.\d{1,2}$
// Allows a decimal, requires commas
(?=.*\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?(\.\d{1,2})?$
// Decimal and commas optional
(?=.*?\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|\d+)?(\.\d{1,2})?$
// Decimals required, commas optional
^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?\.\d{1,2}$
// *Requires/allows X here also implies "used correctly"
Распределение RegEx
- Когда дополнительные детали слишком либеральны, мы должны смотреть в будущее и гарантировать, что есть ряд:
(?=.*\d)
- Может или не может начинаться со знака доллара (я предполагаю, что негативы недействительны):
^\$?
- Следуйте этому с
-?
разрешить отрицательные числа
- Следуйте этому с
- Начинается с 1-3 номера:
[1-9]\d{0,2}
- Может быть почти
(\d{1,3})
, но это позволило бы "0,123" - Одно исключение может начинаться с 0 в случае "$0,50" или "0,50":
|0
- Эти регулярные выражения предполагают, что несколько ведущих нулей недопустимы
- Может быть почти
- Любое количество трехзначных чисел, разделенных запятой:
(,\d{3})*
- Удалить
?
до\.
если вы хотите запретить числа, начинающиеся с "$."
- Удалить
- Требует или разрешает десятичную (одну или две цифры):
\.\d{1,2}
или же(\.\d{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 = /(?=.*\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?(\.\d{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/>');
}
Вот регулярное выражение, которое должно достичь этого для вас.
Начало должно быть числовым или знаком $. Может быть любое количество цифр с запятыми, но оно должно начинаться и заканчиваться цифрой. Опционально может быть десятичная точка с двумя цифрами после нее в конце строки.
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/