Регулярное выражение для суммы в долларах в JavaScript

Я знаю, что это было сделано тысячу раз, но у меня проблемы с этим. Мне нужно отформатировать значение текстового ввода для суммы в долларах. Никаких запятых не должно быть разрешено. Допускается только два десятичных знака. Примеры того, что должно быть разрешено:

  • 100
  • 100,10
  • $ 100
  • $ 100,25

Ниже мое текущее неполное регулярное выражение. В настоящее время он позволяет включать в себя несколько значков доллара в любом месте (не только в начале), несколько десятичных точек, которые должны быть включены в любом месте, и более двух десятичных знаков, которых он не должен.

<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" language="Javascript">
    $(function(){

        jQuery('.dollarAmountOnly').keyup(function () {
            this.value = this.value.replace(/[^$0-9\.]/g, '');
        });
    });
</script>
</head>
<body>
<input type="text" class="dollarAmountOnly"/>
</body>
</html>

Я был бы очень признателен за помощь. Благодарю!

Ответ 1

РЕДАКТИРОВАТЬ

Извините, на ваш вопрос четко прописано ровно два десятичных знака. Это то, что вы хотите:

var r = /^\$?[0-9]+(\.[0-9][0-9])?$/;

console.log(r.test("12.55"));  //true
console.log(r.test("$12.55"));  //true
console.log(r.test("$12"));     //true

console.log(r.test("$12."));    //false
console.log(r.test("$12.2"));    //false
console.log(r.test("$$12"));     //false
console.log(r.test("$12.555")); //false

Вам нужно избежать знака доллара, после чего вы получите две цифры опциона после десятичной точки:

var r = /^\$?[0-9]+\.?[0-9]?[0-9]?$/;

console.log(r.test("12.55"));  //true
console.log(r.test("$12.55"));  //true
console.log(r.test("$12."));    //true
console.log(r.test("$12"));     //true

console.log(r.test("$$12"));     //false
console.log(r.test("$12.555")); //false

скрипка

Или, чтобы разрешить произвольные цифры после десятичной точки, вы можете использовать закрытие Kleene вместо двух необязательных цифр

var r = /^\$?[0-9]+\.?[0-9]*$/;

console.log(r.test("12.55"));  //true
console.log(r.test("$12.55"));  //true
console.log(r.test("$12."));    //true
console.log(r.test("$12"));     //true
console.log(r.test("$12.555")); //true

console.log(r.test("$$12"));     //false

Ответ 2

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

/^\$?\d+(,\d{3})*\.?[0-9]?[0-9]?$/

Я защищаю его и удаляю запятые на бэкэнд, если вы на самом деле не хотите их. Все, что облегчит работу пользователя. Якоб Нильсон обсуждает громоздкие формы в точке № 7.

Ответ 3

Я бы рекомендовал сделать проверку не на .keyup (то есть, как пользовательские типы), но когда пользователь отправит форму.

Затем вместо замены недопустимых символов вы можете просто проверить, что текстовое поле dollarAmountOnly соответствует правильному регулярному выражению.

Регулярное выражение для действительной цены (это позволяет использовать конечные/ведущие пробелы):

/^ *\$?\d+(?:\.\d{2})? *$/g

Поэтому, когда пользователь нажимает submit, вы видите, совпадает ли регулярное выражение с параметром dollarAmountOnly, а если нет, то пусть пользователь знает как-то.

Ответ 4

Вот регулярное выражение, которое я использовал для определения различных валют в javascript:

 _this.currencyRegex = /^(\$|\€\£|\₪|)(?!0\.00)\d{1,3}(,\d{3})*(\.\d\d)?$/;

и хороший инструмент для отладки:

https://regex101.com/r/hL2pF2/26