Как проверить, является ли строка натуральным числом?

В javascript, как вы можете проверить, является ли строка натуральным числом (включая нули)?

Спасибо

Примеры:

'0' // ok
'1' // ok
'-1' // not ok
'-1.1' // not ok
'1.1' // not ok
'abc' // not ok

Ответ 1

Вот мое решение:

function isNaturalNumber(n) {
    n = n.toString(); // force the value incase it is not
    var n1 = Math.abs(n),
        n2 = parseInt(n, 10);
    return !isNaN(n1) && n2 === n1 && n1.toString() === n;
}

Вот демо:

var tests = [
        '0',
        '1',
        '-1',
        '-1.1',
        '1.1',
        '12abc123',
        '+42',
        '0xFF',
        '5e3'
    ];

function isNaturalNumber(n) {
    n = n.toString(); // force the value incase it is not
    var n1 = Math.abs(n),
        n2 = parseInt(n, 10);
    return !isNaN(n1) && n2 === n1 && n1.toString() === n;
}

console.log(tests.map(isNaturalNumber));

вот результат:

[true, true, false, false, false, false, false, false, false]

DEMO: http://jsfiddle.net/rlemon/zN6j3/1

Примечание: это не истинное натуральное число, однако я понял, что ОП не хочет реального натурального числа. Вот решение для натуральных натуральных чисел:

function nat(n) {
    return n >= 0 && Math.floor(n) === +n;
}

http://jsfiddle.net/KJcKJ/

предоставляется @BenjaminGruenbaum

Ответ 2

Используйте регулярное выражение

function isNaturalNumber (str) {
    var pattern = /^(0|([1-9]\d*))$/;
    return pattern.test(str);
}

Функция вернет либо true, либо false, чтобы вы могли сделать чек на основе этого.

if(isNaturalNumber(number)){ 
   // Do something if the number is natural
}else{
   // Do something if it not natural
}

Источник: http://www.codingforums.com/showthread.php?t=148668

Ответ 3

Если у вас феомия регулярного выражения, вы можете сделать что-то вроде этого:

function is_natural(s) {
    var n = parseInt(s, 10);

    return n >= 0 && n.toString() === s;
}

И некоторые тесты:

> is_natural('2')
true
> is_natural('2x')
false
> is_natural('2.0')
false
> is_natural('NaN')
false
> is_natural('0')
true
> is_natural(' 2')
false

Ответ 4

Вы можете использовать

var inN = !!(+v === Math.abs(~~v) && v.length);

Последний тест обеспечивает '' дает false.

Обратите внимание, что он не будет работать с очень большими числами (например, 1e14)

Ответ 5

Вы можете сделать if(num.match(/^\d+$/)){ alert(num) }

Ответ 6

Вы можете проверить int с regexp:

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

Ответ 7

function isNatural(num){
    var intNum = parseInt(num);
    var floatNum = parseFloat(num);
    return (intNum == floatNum) && intNum >=0;
}

Ответ 8

Number() корректно разбирает строковый ввод. ( "12basdf" - NaN, "+42" - 42 и т.д.). Используйте это, чтобы проверить и посмотреть, действительно ли это число. Оттуда просто выполните пару проверок, чтобы убедиться, что вход соответствует остальным вашим критериям.

function isNatural(n) {
    if(/\./.test(n)) return false; //delete this line if you want n.0 to be true
    var num = Number(n);
    if(!num && num !== 0) return false;
    if(num < 0) return false;
    if(num != parseInt(num)) return false; //checks for any decimal digits
    return true;
}

Ответ 9

function isNatural(n){
    return Math.abs(parseInt(+n)) -n === 0;
}

Это возвращает false для '1 dog', '-1', '' или '1.1' и возвращает true

для неотрицательных целых чисел или их строк, включая "1.2345e12", и не '1.2345e3'.

Ответ 10

Преобразуйте строку в число, а затем проверьте:

function isNatural( s ) {
  var n = +s;
  return !isNaN(n) && n >= 0 && n === Math.floor(n);
}

Ответ 11

function isNatural(number){
    var regex=/^\d*$/;
    return regex.test( number );
}

Ответ 12

Я знаю, что эта ветка немного устарела, но я считаю, что нашел наиболее точное решение:

function isNat(n) {                // A natural number is...
  return n != null                 // ...a defined value,
      && n >= 0                    // ...nonnegative,
      && n != Infinity             // ...finite,
      && typeof n !== 'boolean'    // ...not a boolean,
      && !(n instanceof Array)     // ...not an array,
      && !(n instanceof Date)      // ...not a date,
      && Math.floor(n) === +n;     // ...and whole.
}

Мое решение - это в основном эволюция вклада, сделанного @BenjaminGruenbaum.

Чтобы подтвердить мои требования точности, я значительно расширил тесты, которые сделали @rlemon, и поставил каждое предлагаемое решение, включая мои собственные:

http://jsfiddle.net/icylace/qY3FS/1/

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

EDIT: Я обновил isNat(), чтобы меньше полагаться на утиную печать и, следовательно, должен быть еще более надежным.