2013-05-28 3 views
10

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

Благодаря

Примеры:

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

http://stackoverflow.com/questions/3645544/checking-if-a-variable-is-an-integer-in-javascript –

+0

Не являются ли естественные числа просто неотрицательные целые числа? [Попробуйте 'parseInt'] (http://stackoverflow.com/questions/1133770/how-do-i-convert-a-string-into-an-integer-in-javascript)? [parseInt в Mozilla Developer Network] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/parseInt) – kush

+0

@kush: parseInt? Это проверяет? –

ответ

17

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

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)); 

здесь выход:

[правда, истина, ложь, 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

+0

Я обновляю это: кажется, что он терпит неудачу на «+42». Решение не самое элегантное, но работает. – rlemon

+0

+1 Это может не быть " самый изящный », но он работает только один. –

+0

@BenjaminGruenbaum: Эй, мои работы тоже;) – Blender

2

Вы могли бы использовать

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

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

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

+1

Ну 'parseFloat()' и 'parseInt()' оба принимают мусор на конец числовой части строки, поэтому 'parseFloat (" 12balloons ")' возвращает '12'. – Pointy

+1

OP не говорит, что он хочет делать с «12balloons». –

+0

Вы можете использовать: isFinite (e) && Math.abs (Math.round (e)) == e – pdjota

2

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

+2

нет, вы не может (см. комментарий в ответе ChrisB) –

0

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

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

В примере 1.1 «не в порядке» –

+1

@JamesMontagne ответ был отредактирован :-) – Pointy

7

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

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's not natural 
} 

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

+2

не работает для '+ 42' или' 5e3' или '0xFF' или ... длинный рассказ короткий: цифры больше, чем текст для разбора –

+0

Правильно, и это не обязательно, поскольку это не требования OP. –

+1

@ChrisB Конечно. Эти значения удовлетворяют натуральному числу. Вы не должны просто кодировать примеры – Ian

6

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

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 
+0

Меня поражает, сколько людей не включает параметр radix – Ian

+1

Независимо от того, является ли' 2.0 'является или не является естественным числом, является интересным философским вопросом :-) (Может ли число быть точно равно натуральному числу и все же не * быть * натуральным числом? Я не математик.) – Pointy

+0

@Pointy: Хорошо, вы * можете * доказать, что 2, за которым следует бесконечная строка нулей после десятичной точки, это число 2, точно так же, как 1, за которым следует бесконечная строка из девяти после десятичной точки также 2. – Blender

1

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

var intRegex = /^\d+$/; 
if(intRegex.test(someNumber)) { 
alert('Natural'); 
} 
1
function isNatural(num){ 
    var intNum = parseInt(num); 
    var floatNum = parseFloat(num); 
    return (intNum == floatNum) && intNum >=0; 
} 
+2

'2 == 2.0', поэтому ваша функция вернет' true' для '' 2.0''. – Blender

+0

@Blender Можно утверждать, что '2.0' должен быть действительным из-за самого факта, что' 2 == 2.0'. Зависит от того, что хочет OP. – ajp15243

+0

@ ajp15243 '2.0' не является целым числом, поэтому не является натуральным числом – Ian

1

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; 
} 
1
function isNatural(n){ 
    return Math.abs(parseInt(+n)) -n === 0; 
} 

Это возвращает ложь для '1 собака', '-1', '' или '1.1', и возвращает истину

для неотрицательных целых чисел или их последовательностей, в том числе «1.2345 e12 ', и не' 1.2345e3 '.

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

Я знаю, что эта нить немного старый, но я считаю, что я нашел наиболее точное решение до сих пор:

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(), чтобы меньше полагаться на утиную печать и, следовательно, быть еще более надежным.

Смежные вопросы