Вопрос по javascript – JavaScript - тест на целое число

77

У меня есть текстовое поле, которое позволяет пользователю ввести свой возраст. Я пытаюсь выполнить некоторую проверку на стороне клиента в этом поле с помощью 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;
    }

Странно то, что я ввел отдельные символы в текстовое поле, например & quot; b & quot; и этот метод возвращает истину. Как мне убедиться, что пользователь вводит только целое число?

Спасибо

И в этом отношении "1,0" целое число? Nosredna
Нету. :) Sasha Chedygov
Если пользователь вводит «1.1», хотите ли вы, чтобы проверка не прошла проверку или была вынуждена «1»? Nosredna
Просто связанная заметка, вы всегда должны вызывать parseInt () с двумя параметрами - значением и основанием (основанием). В противном случае parseInt () попытается угадать основание вашего ввода. waxwing
равно "+ 35"; целое число? Jason S

Ваш Ответ

11   ответов
-3
If (enteredAge < "1" || enteredAge > "130") ......

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
131
var intRegex = /^\d+$/;
if(intRegex.test(someNumber)) {
   alert('I am an int');
   ...
}

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededthis question.
4

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

Modular Divison

Example
1. 25.5 % 1 != 0 and ,
2. 25 % 1 == 0

А также     if (field_value * 1) NaN if string, например: 25,34 или abcd и т. д ...     еще целое число или число

1

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
13

то есть

if(isNaN(intValue))

на месте

if (intValue == Number.NaN)
Error: User Rate Limit Exceeded
1

вы можете использовать что-то вроде:

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

Побитовое или оператор принудительно преобразует в знаковое 32-битное целое число. Преобразование строки с обеих сторон обеспечивает соответствие истинного и ложного значений.

8

UPDATE

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

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

Спасибо, Дональд. МакЛин :)

Если вы хотите проверить, пишете ли вы числа при вводе (и не вводите другие символы в поле ввода), вы можете использовать эту простую функцию и определить разрешенные элементы (включая все, что вы хотите отфильтровать). Таким образом, вы можете выбрать не только целые числа, но, например, определенную группу символов. Пример основан на 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">

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

Error: User Rate Limit Exceededstackoverflow.com/questions/4471582/javascript-keycode-vs-whichError: User Rate Limit Exceeded
31

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

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

ОБНОВИТЬ:

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

First, when parsing string values that use a comma to indicate the decimal place, this method doesn't work. (Not surprising, how could it? Given "1,001" for example in the US it's an integer while in Germany it isn't.) Second, the behavior of parseFloat and parseInt has changed in certain browsers since this answer was written and vary by browser. ParseInt is more aggressive and will discard letters appearing in a string. This is great for getting a number but not so good for validation.

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

Error: User Rate Limit ExceededisInt('5a') == true!
Error: User Rate Limit Exceeded
function isInt(value) { return !isNaN(parseInt(value, 10)) && parseInt(value, 10) == parseFloat(value); }Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededtoStringError: User Rate Limit Exceededvar isint = function (a) { return ((parseInt(a) === parseFloat(a)) && (a.toString() === parseInt(a).toString())); }
0

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

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

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

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

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

0

isInteger() методNumber объект

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

Этот метод работает правильно, еслиx являетсяundefined или жеnull, Но это имеетплохая поддержка браузера теперь

2

Похожие вопросы