Javascript процентное подтверждение - PullRequest
8 голосов
/ 23 октября 2008

Я после регулярного выражения, которое проверяет процент от 0 100 и допускает два десятичных знака.

Кто-нибудь знает, как это сделать, или знает хороший веб-сайт, на котором есть пример общих регулярных выражений, используемых для проверки на стороне клиента в javascript?

@ Том - Спасибо за вопросы. В идеале не должно быть начальных 0 или других конечных символов.

Спасибо всем, кто ответил до сих пор. Я нашел комментарии действительно интересными.

Ответы [ 9 ]

30 голосов
/ 23 октября 2008

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

var x = parseFloat(str);
if (isNaN(x) || x < 0 || x > 100) {
    // value is out of range
}
11 голосов
/ 23 октября 2008

Я предлагаю это:

(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)

Это соответствует 100, 100.0 и 100.00, используя эту часть

^100(\.0{1,2})?$

и числа, такие как 0, 15, 99, 3.1, 21.67, используя

^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$

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

5 голосов
/ 23 октября 2008

Это напоминает мне о старой записи в блоге Алекса Пападимулиса (из Daily WTF слава), где он рассказывает следующую историю:

"Клиент попросил меня собрать и установить специальную систему стеллажей. Я нахожусь в точке, где мне нужно ее прибить, но я не уверен, что использовать, чтобы вбить гвозди. Должен ли я использовать старый ботинок или стеклянная бутылка? "

Как бы вы ответили на вопрос?

  1. Это зависит. Если вы хотите растереть маленький (20-фунтовый) гвоздь в нечто вроде гипсокартона, вам будет гораздо проще использовать бутылку, особенно если обувь грязная. Однако, если вы пытаетесь вбить тяжелый гвоздь в какое-то дерево, идите с туфлей: бутылочка с крушением в руке.

  2. Что-то в корне неверно в том, как вы строите; вам нужно использовать настоящие инструменты. Да, это может быть связано с поездкой в ​​набор инструментов (или даже в магазин бытовой техники), но правильное решение этой проблемы позволит сэкономить много времени, денег и усугубить жизненный цикл вашего продукта. Вам нужно прекратить строить вещи за деньги, пока вы не поймете основы строительства.

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

Проблема при попытке использовать регулярные выражения для проверки числовых диапазонов заключается в том, что трудно изменить, если требования к разрешенному диапазону изменяются. Сегодня требование может состоять в проверке чисел от 0 до 100, и можно написать регулярное выражение для того, что не вызывает у вас кровотечения. Но на следующей неделе требование может измениться, поэтому допустимы значения от 0 до 315. Удачи в изменении вашего регулярного выражения.

Решение, данное Грегом Хьюгиллом, вероятно, лучше - даже если оно подтвердит "99fxx" как "99". Но учитывая обстоятельства, которые на самом деле могут быть в порядке.

1 голос
/ 23 октября 2008

Учитывая, что ваше значение в стр

str.match(/^(100(\.0{1,2})?|([0-9]?[0-9](\.[0-9]{1,2})))$/)
0 голосов
/ 04 сентября 2018
(100(\.(0){1,2})?|([1-9]{1}|[0-9]{2})(\.[0-9]{1,2})?)
0 голосов
/ 10 апреля 2018

Я рекомендую это, если вы не разрабатываете исключительно для англоязычных пользователей:

[0-9]{1,2}((,|\.)[0-9]{1,10})?%?

Вы можете просто заменить 10 на 2, чтобы получить два десятичных знака.

Мой пример будет соответствовать:

15.5
5.4366%
1,43
50,55%
34
45%

Из-за того, что результат этого сложнее разыграть, но что-то вроде этого подойдет (Java Code):

private static Double getMyVal(String myVal) {
    if (myVal.contains("%")) {
        myVal = myVal.replace("%", "");
    }
    if (myVal.contains(",")) {
        myVal = myVal.replace(',', '.');
    }
    return Double.valueOf(myVal);
}
0 голосов
/ 23 октября 2008

@ mlarsen: Разве это не то, что регулярное выражение здесь не сделает работу лучше.

Помните, что проверка должна выполняться как на стороне клиента, так и на стороне сервера, поэтому что-то вроде:

100|(([1-9][0-9])|[0-9])(\.(([0-9][1-9])|[1-9]))?

будет проверкой на нескольких языках, просто остерегайтесь проверки длины ввода с длиной совпадения на выходе.

0 голосов
/ 23 октября 2008
^100(\.(0){0,2})?$|^([1-9]?[0-9])(\.(\d{0,2}))?\%$

Это будет соответствовать:
100,00
необязательный «1-9», за которым следует цифра (это делает часть int), за которой необязательно следует точка и две цифры


Из того, что я вижу, пример Грега Хьюгилла не очень хорошо работает, потому что parseFloat ('15x') просто возвращает 15, что соответствует условию 0 parseFloat явно неверно, поскольку оно не проверяет процентное значение, оно пытается принудительно выполнить проверку. Некоторые люди здесь жалуются на ведущие нули, а некоторые игнорируют конечные недопустимые символы. Может быть, автору вопроса следует отредактировать его и уточнить, что ему нужно.

0 голосов
/ 23 октября 2008

(100|[0-9]{1,2})(\.[0-9]{1,2})?

Это должно быть регулярное выражение, которое вы хотите. Я предлагаю вам прочитать освоение регулярных выражений и скачать RegexBuddy или The Regex Coach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...