Проблема с проверкой RegularExpression с использованием JQuery - PullRequest
0 голосов
/ 23 декабря 2011

Я хотел запретить пользователю вводить значения из определенного диапазона.Поэтому я написал следующий код, используя JQuery 1.7.1

var reg = /^[0-9]{1,4}[.]{0,1}[0-9]{0,2}$/g;

$("#txt" + filterID).bind('keypress', function (e) {
    var nn = $("#txtValues");
    var strValue = nn[0].value.toString();
    strValue = $.trim(strValue);
    var bool = reg.test(strValue);
    if (strValue.length == 0 && !((e.which < 48 || e.which > 57) && e.which != 46 && e.which != 8 && e.which != 0)) {
        return true;
    }
    else if (bool) {
        return true;
    }
    else { 
        e.preventDefault();
    }
}); 

Когда я проверяю поле ввода, оно работает не так, как ожидалось.Предполагается разрешить число с плавающей запятой с двумя цифрами после десятичной точки. Некоторые допустимые форматы:

1
1.
1.0
0
1.20
0.0
1.23
123.43
1234.12

Я не уверен, где я поступил неправильно.После признания 1. это становится неудачным.Кто-нибудь может помочь мне определить проблему?

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

Событие keypress наступает до обновления значения.Используйте следующий код, который преобразует свойство event.which в символ, используя метод String.fromCharCode.

Непечатные нажатия клавиш сгенерируют ноль event.which, который, безусловно, не является цифрой или точкой.

Что касается RegExp, вы должны сгруппировать выражение после точки и добавить вопросительный знак, чтобы сказать «Пусть это совпадение группы будет необязательным».

var reg = /^[0-9]{1,4}(\.[0-9]{0,2})?$/;

$("#txt" + filterID).bind('keypress', function (e) {
    var nn = $("#txtValues");
    var strValue = nn[0].value.toString() + String.fromCharCode(e.which);
    strValue = $.trim(strValue);
    var bool = reg.test(strValue);
    if (bool) {
        return true;
    }
    else { 
        e.preventDefault();
    }
});

Шаблон будет соответствоватьследующее:

1
1234
1234.5
But not:
1235.    (Change {0,2} to {1,2} if you want to reject this match)
123456
1234.567
0 голосов
/ 23 декабря 2011

Операторы интервалов в вашем выражении {0,1} и {0,2} позволяют группе повторяться от 0 до 1 или, соответственно, от 0 до 2 раз, что позволяет использовать десятичные числа, а также целые числа. Также вы должны указать буквальную точку \. вместо просто точки, которая соответствует любому символу. Если вы хотите ввести числа с двумя цифрами после десятичной дроби, попробуйте ограничить интервал до {2} и объединить его в группу вместе с точкой, например, /^[0-9]{1,4}(\.{1}[0-9]{2})$/

...