В javascript, как вы можете проверить, является ли строка натуральным числом (включая нули)?
Спасибо
Примеры:
'0' // ok
'1' // ok
'-1' // not ok
'-1.1' // not ok
'1.1' // not ok
'abc' // not ok
В javascript, как вы можете проверить, является ли строка натуральным числом (включая нули)?
Спасибо
Примеры:
'0' // ok
'1' // ok
'-1' // not ok
'-1.1' // not ok
'1.1' // not ok
'abc' // not ok
Вот мое решение:
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;
}
предоставляется @BenjaminGruenbaum
Используйте регулярное выражение
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
Если у вас феомия регулярного выражения, вы можете сделать что-то вроде этого:
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
Вы можете использовать
var inN = !!(+v === Math.abs(~~v) && v.length);
Последний тест обеспечивает ''
дает false
.
Обратите внимание, что он не будет работать с очень большими числами (например, 1e14
)
Вы можете сделать if(num.match(/^\d+$/)){ alert(num) }
Вы можете проверить int с regexp:
var intRegex = /^\d+$/;
if(intRegex.test(someNumber)) {
alert('Natural');
}
function isNatural(num){
var intNum = parseInt(num);
var floatNum = parseFloat(num);
return (intNum == floatNum) && intNum >=0;
}
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;
}
function isNatural(n){
return Math.abs(parseInt(+n)) -n === 0;
}
Это возвращает false для '1 dog', '-1', '' или '1.1' и возвращает true
для неотрицательных целых чисел или их строк, включая "1.2345e12", и не '1.2345e3'.
Преобразуйте строку в число, а затем проверьте:
function isNatural( s ) {
var n = +s;
return !isNaN(n) && n >= 0 && n === Math.floor(n);
}
function isNatural(number){
var regex=/^\d*$/;
return regex.test( number );
}
Я знаю, что эта ветка немного устарела, но я считаю, что нашел наиболее точное решение:
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()
, чтобы меньше полагаться на утиную печать и, следовательно, должен быть еще более надежным.