In javascript, how can you check if a string is a natural number (including zeros)?
Thanks
Examples:
'0' // ok
'1' // ok
'-1' // not ok
'-1.1' // not ok
'1.1' // not ok
'abc' // not ok
In javascript, how can you check if a string is a natural number (including zeros)?
Thanks
Examples:
'0' // ok
'1' // ok
'-1' // not ok
'-1.1' // not ok
'1.1' // not ok
'abc' // not ok
 
    
    Here is my solution:
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;
}
Here is the demo:
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));
here is the output:
[true, true, false, false, false, false, false, false, false]
DEMO: http://jsfiddle.net/rlemon/zN6j3/1
Note: this is not a true natural number, however I understood it that the OP did not want a real natural number. Here is the solution for real natural numbers:
function nat(n) {
    return n >= 0 && Math.floor(n) === +n;
}
provided by @BenjaminGruenbaum
Use a regular expression
function isNaturalNumber (str) {
    var pattern = /^(0|([1-9]\d*))$/;
    return pattern.test(str);
}
The function will return either true or false so you can do a check based on that.
if(isNaturalNumber(number)){ 
   // Do something if the number is natural
}else{
   // Do something if it's not natural
}
 
    
    If you have a regex phobia, you could do something like this:
function is_natural(s) {
    var n = parseInt(s, 10);
    return n >= 0 && n.toString() === s;
}
And some tests:
> 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
 
    
    You could use
var inN = !!(+v === Math.abs(~~v) && v.length);
The last test ensures '' gives false.
Note that it wouldn't work with very big numbers (like 1e14)
 
    
    You can check for int with 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() parses string input accurately. ("12basdf" is NaN, "+42" is 42, etc.). Use that to check and see if it's a number at all. From there, just do a couple checks to make sure that the input meets the rest of your criteria.
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;
}
This returns false for '1 dog', '-1', '' or '1.1', and returns true
for non-negative integers or their strings, including '1.2345e12', and not '1.2345e3'.
 
    
    I know this thread is a bit old but I believe I've found the most accurate solution thus far:
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.
}
My solution is basically an evolution of the contribution made by @BenjaminGruenbaum.
To back up my claim of accuracy I've greatly expanded upon the tests that @rlemon made and put every proposed solution including my own through them:
http://jsfiddle.net/icylace/qY3FS/1/
As expected some solutions are more accurate than others but mine is the only one that passes all the tests.
EDIT:  I updated isNat() to rely less on duck typing and thus should be even more reliable.
 
    
    This is how I check if a string is a natural number (including zeros!).
var str = '0' // ok
var str1 = '1' // ok
var str2 = '-1' // not ok
var str3 = '-1.1' // not ok
var str4 = '1.1' // not ok
var str5 = 'abc' // not ok
console.log("is str natural number (including zeros): ", Number.isInteger(Number(str)) && Number(str) >= 0)
console.log("is str1 natural number (including zeros): ", Number.isInteger(Number(str1)) && Number(str1) >= 0)
console.log("is str2 natural number (including zeros): ", Number.isInteger(Number(str2)) && Number(str2) >= 0)
console.log("is str3 natural number (including zeros): ", Number.isInteger(Number(str3)) && Number(str3) >= 0)
console.log("is str4 natural number (including zeros): ", Number.isInteger(Number(str4)) && Number(str4) >= 0)
console.log("is str5 natural number (including zeros): ", Number.isInteger(Number(str5)) && Number(str5) >= 0) 
    
     
    
    Convert the string to a number and then check:
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 isNatural(n) {
 return Number(n) >= 0 && Number(n) % 1 === 0;
}
 
    
    Why not simply use modulo? if(num % 1 !== 0) return false;
 
    
    Use /^\d+$/ will match 000.
so use /^[1-9]\d*$|^0$/ match positive integer or 0 will be right.
