JQuery для принятия как отрицательных, так и неотрицательных значений

Я пробовал это. Это принимает только целые числа. Я хочу как негативный, так и не отрицательный.

    $(function() {
        $('.spinner').keyup(function() {
            if (this.value.match(/[^0-9]/g)) {
                this.value = this.value.replace(/[^0-9]/g, '');
            }
        });
    });
0
nl ja de
@PeterHerdenborg Да, он должен. Ему нужно только удалить цифры, если они содержат цифры.
добавлено автор Barmar, источник
В хром тип = «число» с радостью игнорирует что-либо не число
добавлено автор mplungjan, источник
Да, извините, я получил это неправильно, поэтому я удалил свой комментарий.
добавлено автор Peter Herdenborg, источник
Не могли бы вы рассказать мне, что такое HTML-элемент $ ('. Spinner') ?
добавлено автор kidwon, источник

3 ответы

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

$('.spinner').keyup(function (evt) {
    var previousValue = $(this).data("prev") || "";
    var currentValue = this.value;
    var valid = true;
    if (currentValue.length > 0 && currentValue !== "-") {
        //having something we can check:
        var number = Number(currentValue);

        //integer only if not NaN and integer value equals
        valid = (!isNaN(number) && parseInt(number, 10) == number);
    }

    if (valid) {
        $(this).data("prev", currentValue);
    } else {
        //restore last good value:
        this.value = (previousValue.length == 0) ? "" : parseInt(previousValue, 10);
    }
});

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

Обратите внимание на использование Number() вместо parseInt() , это связано с тем, что позже разрешено такие вещи, как «5a», который обрабатывается как 5, а Number (" 5a ") даст значение NaN.

Live test case.

0
добавлено

Нет необходимости в согласовании и замене. Вместо

if (this.value.match(/[^0-9]/g)) {
    this.value = this.value.replace(/[^0-9]/g, '');
}

использование

this.value = this.value.replace(/([+-]?\d+)/, '$1');

Я предполагаю, что вы только ожидаете найти одно целое в поле.

0
добавлено

не тестировали, но вы пробовали что-то вроде этого:

$(function() {
    $('.spinner').keyup(function() {
        if (this.value.match(/[^0-9-]/g)) {
            this.value = this.value.replace(/[^0-9-]/g, '');
        }
    });
});

Добавив лишний '-' в reg-ex: первый должен указать диапазон, второй - фактический символ.

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

^[-]{0,1}[0-9]+

Начало строки ничем или - за которым следует последовательность цифр, по крайней мере один или несколько.

0
добавлено
Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda