在javascript中,如何检查字符串是否为自然数(包括零)?
由于
示例:
'0' // ok
'1' // ok
'-1' // not ok
'-1.1' // not ok
'1.1' // not ok
'abc' // not ok
答案 0 :(得分:20)
这是我的解决方案:
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
注意:这不是一个真正的自然数,但我理解OP不需要真正的自然数。以下是真实自然数的解决方案:
function nat(n) {
return n >= 0 && Math.floor(n) === +n;
}
提供
答案 1 :(得分:8)
使用正则表达式
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
}
答案 2 :(得分: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
答案 3 :(得分:2)
您可以使用
var inN = !!(+v === Math.abs(~~v) && v.length);
最后一项测试可确保''
提供false
。
请注意,它不适用于非常大的数字(例如1e14
)
答案 4 :(得分:2)
您可以执行if(num.match(/^\d+$/)){ alert(num) }
答案 5 :(得分:1)
您可以使用regexp检查int:
var intRegex = /^\d+$/;
if(intRegex.test(someNumber)) {
alert('Natural');
}
答案 6 :(得分:1)
function isNatural(num){
var intNum = parseInt(num);
var floatNum = parseFloat(num);
return (intNum == floatNum) && intNum >=0;
}
答案 7 :(得分: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;
}
答案 8 :(得分:1)
function isNatural(n){
return Math.abs(parseInt(+n)) -n === 0;
}
对于'1 dog',' - 1',''或'1.1'返回false,并返回true
表示非负整数或其字符串,包括'1.2345e12', 和不'1.2345e3'。
答案 9 :(得分:0)
将字符串转换为数字,然后检查:
function isNatural( s ) {
var n = +s;
return !isNaN(n) && n >= 0 && n === Math.floor(n);
}
答案 10 :(得分:0)
function isNatural(number){
var regex=/^\d*$/;
return regex.test( number );
}
答案 11 :(得分: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/
正如预期的那样,某些解决方案比其他解决方案更准确,但我的是唯一通过所有测试的解决方案。
编辑:我更新isNat()
以减少对鸭子打字的依赖,因此应该更加可靠。
答案 12 :(得分:0)
这是我检查字符串是否为自然数(包括零)的方法。
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)
答案 13 :(得分:-1)
使用/^\d+$/
将匹配000
。
因此请使用/^[1-9]\d*$|^0$/
匹配正整数,否则0将是正确的。