JavaScript - тест для целого числа

У меня есть текстовое поле, которое позволяет пользователю вводить свой возраст. Я пытаюсь выполнить некоторую проверку на стороне клиента в этом поле с помощью JavaScript. У меня уже есть проверка на стороне сервера. Однако я не могу проверить, что пользователь вводит фактическое целое число. В настоящее время я пытаюсь выполнить следующий код:

    function IsValidAge(value) {
        if (value.length == 0) {
            return false;
        }

        var intValue = parseInt(value);
        if (intValue == Number.NaN) {
            return false;
        }

        if (intValue <= 0)
        {
            return false;
        }
        return true;
    }

Честно говоря, я ввел отдельные символы в текстовое поле типа "b", и этот метод возвращает true. Как я могу гарантировать, что пользователь вводит только целое число?

Спасибо

Ответ 1

UPDATE

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

var key = e.which || e.keyCode;

Спасибо Donald.McLean:)


Если вы хотите проверить, записываете ли вы цифры во время ввода (и не записываете другие символы в поле ввода), вы можете использовать эту простую функцию, и вы можете определить разрешенные элементы (включая все, что вы хотите фильтровать). Таким образом, вы можете выбирать не только целые числа, но, например, определенную группу символов. Пример основан на jQuery, чтобы прикрепить его к полю ввода.

$('#myInputField').keypress(function(e)
{
    var key = e.which || e.keyCode;

    if (!(key >= 48 && key <= 57) && // Interval of values (0-9)
         (key !== 8) &&              // Backspace
         (key !== 9) &&              // Horizontal tab
         (key !== 37) &&             // Percentage
         (key !== 39) &&             // Single quotes (')
         (key !== 46))               // Dot
    {
        e.preventDefault();
        return false;
    }
});

Если вы используете другой ключ, чем определенный, он не появится в поле. И поскольку Angular.js становится сильным в эти дни. это директива, которую вы можете создать для этого в любом поле вашего веб-приложения:

myApp.directive('integer', function()
{
    return function (scope, element, attrs)
    {
        element.bind('keydown', function(e)
        {
            var key = e.which || e.keyCode;

            if (!(key >= 48 && key <= 57) && // Interval (0-9)
                 (key !== 8) &&              // Backspace
                 (key !== 9) &&              // Horizontal tab
                 (key !== 37) &&             // Percentage
                 (key !== 39) &&             // Single quotes (')
                 (key !== 46))               // Dot
            {
                e.preventDefault();
                return false;
            }
        });
    }
});

Но что произойдет, если вы хотите использовать ng-repeat, и вам нужно применить эту директиву только в определенном количестве полей. Ну, вы можете преобразовать верхнюю директиву в одну, подготовленную для того, чтобы признать значение true или false, чтобы иметь возможность решить, какое поле будет зависеть от него.

myApp.directive('rsInteger', function() {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            if (attrs.rsInteger === 'true') {
                element.bind('keydown', function(e)
                {
                    var key = e.which || e.keyCode;

                    if (!(key >= 48 && key <= 57) && // Interval (0-9)
                         (key !== 8) &&              // Backspace
                         (key !== 9) &&              // Horizontal tab
                         (key !== 37) &&             // Percentage
                         (key !== 39) &&             // Single quotes (')
                         (key !== 46))               // Dot
                    {
                        e.preventDefault();
                        return false;
                    }
                });
            }
        }
    }
});

Чтобы использовать эту новую директиву, вам просто нужно сделать это в тексте типа ввода, например:

<input type="text" rs-integer="true">

Надеюсь, это поможет вам.

Ответ 2

var intRegex = /^\d+$/;
if(intRegex.test(someNumber)) {
   alert('I am an int');
   ...
}

Это будет абсолютно, положительно, если пользователь вводит что-либо, кроме неотрицательного целого числа.

Ответ 3

Для проверки подлинности int используйте это:

function isInt(value) { 
    return !isNaN(parseInt(value,10)) && (parseFloat(value,10) == parseInt(value,10)); 
}

Проблема со многими проверками int заключается в том, что они возвращают 'false' для 1.0, который является допустимым целым числом. Этот метод проверяет, что значение float и int parsing равно, поэтому для #.00 оно вернет true.

UPDATE:

В комментариях мы обсудили два вопроса, которые я добавлю к будущим читателям:

  • Во-первых, при анализе строковых значений, которые используют запятую, чтобы указать десятичное место, этот метод не работает. (Не удивительно, как это могло быть? Учитывая "1001", например, в США это целое число, а в Германии это не так.)
  • Во-вторых, поведение parseFloat и parseInt изменилось в некоторых браузерах, так как этот ответ был написан и варьируется в зависимости от браузера. ParseInt более агрессивен и отбрасывает буквы, появляющиеся в строке. Это отлично подходит для получения номера, но не очень хорошего для проверки.

Моя рекомендация и практика использования библиотеки типа Globalize.js для анализа числовых значений для/из пользовательского интерфейса, а не для реализации браузера, и для используйте собственные вызовы только для известных "программно" предоставленных значений, таких как строка, проанализированная из XML-документа.

Ответ 4

use isNaN (n)

то есть.

if(isNaN(intValue))

вместо

if (intValue == Number.NaN)

Ответ 5

Я сделал это, чтобы проверить число и целочисленное значение

if(isNaN(field_value * 1) || (field_value % 1) != 0 ) not integer;
else integer;

Модульное Divison

Пример
 1. 25,5% 1!= 0 и,
 2. 25% 1 == 0

А   if (field_value * 1) NaN, если строка eg: 25,34 или abcd и т.д....   else integer или number

Ответ 6

function isInt (x) {return Math.floor(x) === x;}

Ответ 7

Если ваш номер находится в 32-битном целочисленном диапазоне, вы можете пойти с чем-то вроде:

function isInt(x) { return ""+(x|0)==""+x; }

Побитовое или операторное действие преобразует в подписанный 32-битный int. Преобразование строк с обеих сторон гарантирует соответствие true/false.

Ответ 8

Никто не пробовал эту простую вещь?

function isInt(value) {
    return value == parseInt(value, 10);
}

Что не так с этим?

Ответ 9

Вы можете использовать метод isInteger() объекта Number

if ( (new Number(x)).isInteger() ) {
  // handle integer
}

Этот метод работает правильно, если x - undefined или null. Но он бедный браузер поддержки на данный момент

Ответ 10

Я нашел ответы NaN отсутствующими, потому что они не подхватывают завершающие символы (поэтому "123abc" считается допустимым числом), поэтому я попытался преобразовать строку в целое число и вернуться к строке и убедиться, что она соответствует оригинал после преобразования:

if ("" + parseInt(stringVal, 10) == stringVal) { alert("is valid number"); }

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

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

Конечно, это произойдет, если вы используете разделители (например, "1000" или "1.000" в зависимости от вашей локали) - цифры разрешены только здесь.

Ответ 11

If (enteredAge < "1" || enteredAge > "130") ......

Простой и он работает... пока они не развивают бессмертие