如何检查一个variables是否是一个JavaScript中的整数?

如何检查一个variables是否是JavaScript中的一个整数,如果不是,则发出警报? 我试过这个,但是不起作用:

<html> <head> <script type="text/javascript"> var data = 22; alert(NaN(data)); </script> </head> </html> 

使用===运算符如下

 if (data === parseInt(data, 10)) alert("data is integer") else alert("data is not an integer") 

这取决于,你是否也想把string作为潜在的整数?

这将做到:

 function isInt(value) { return !isNaN(value) && parseInt(Number(value)) == value && !isNaN(parseInt(value, 10)); } 

按位操作

简单的parsing和检查

 function isInt(value) { var x = parseFloat(value); return !isNaN(value) && (x | 0) === x; } 

短路,并保存parsing操作:

 function isInt(value) { if (isNaN(value)) { return false; } var x = parseFloat(value); return (x | 0) === x; } 

或者也许一举两得:

 function isInt(value) { return !isNaN(value) && (function(x) { return (x | 0) === x; })(parseFloat(value)) } 

testing:

 isInt(42) // true isInt("42") // true isInt(4e2) // true isInt("4e2") // true isInt(" 1 ") // true isInt("") // false isInt(" ") // false isInt(42.1) // false isInt("1a") // false isInt("4e2a") // false isInt(null) // false isInt(undefined) // false isInt(NaN) // false 

这是小提琴: http : //jsfiddle.net/opfyrqwp/28/

这里是yolpo: http : //www.yolpo.com/embed.html? gist = a3c46f837ea7bbb708ae&autoplay =2

性能

testing表明,短路解决scheme具有最佳的性能(操作/秒)。

 // Short-circuiting, and saving a parse operation function isInt(value) { var x; if (isNaN(value)) { return false; } x = parseFloat(value); return (x | 0) === x; } 

这是一个基准: http : //jsben.ch/#/htLVw

如果你看中了一个短而钝的短路forms:

 function isInt(value) { var x; return isNaN(value) ? !1 : (x = parseFloat(value), (0 | x) === x); } 

当然,我build议让缩小器来照顾。

假设你不知道有关variables的问题,你应该采取这种方法:

 if(typeof data === 'number') { var remainder = (data % 1); if(remainder === 0) { // yes, it is an integer } else if(isNaN(remainder)) { // no, data is either: NaN, Infinity, or -Infinity } else { // no, it is a float (still a number though) } } else { // no way, it is not even a number } 

简而言之:

 if(typeof data==='number' && (data%1)===0) { // data is an integer } 

你可以检查数字是否有余数:

 var data = 22; if(data % 1 === 0){ // yes it's an integer. } 

请注意,如果您的input也可能是文本,而您想先检查是不是,那么您可以先检查该types:

 var data = 22; if(typeof data === 'number'){ // yes it is numeric if(data % 1 === 0){ // yes it's an integer. } } 

Number.isInteger()似乎是要走的路。

MDN还为不支持Number.isInteger()浏览器提供了以下Number.isInteger() ,主要是所有版本的IE。

链接到MDN页面

 Number.isInteger = Number.isInteger || function(value) { return typeof value === "number" && isFinite(value) && Math.floor(value) === value; }; 

使用时要小心

数字%1

空string('')或布尔(真或假)将返回为整数。 你可能不想这样做

 false % 1 // true '' % 1 //true 

Number.isInteger(数据)

 Number.isInteger(22); //true Number.isInteger(22.2); //false Number.isInteger('22'); //false 

在浏览器中build立function。 Dosnt支持较旧的浏览器

备择scheme:

 Math.round(num)=== num 

但是,Math.round()也会失败的空string和布尔值

你可以使用一个简单的正则expression式:

 function isInt(value) { var er = /^-?[0-9]+$/; return er.test(value); } 

首先,NaN是一个“数字”(是的,我知道它很奇怪,只是滚动它),而不是一个“function”。

你需要检查如果variables的types是一个数字,并检查整数我会使用模数。

 alert(typeof data === 'number' && data%1 == 0); 

要检查海报等整数是否需要:

 if (+data===parseInt(data)) {return true} else {return false} 

在数据前注意(将string转换为数字),===精确。

这里是例子:

 data=10 +data===parseInt(data) true data="10" +data===parseInt(data) true data="10.2" +data===parseInt(data) false 

ECMA-262 6.0(ES6)标准包含Number.isInteger函数。

为了添加对旧浏览器的支持,我强烈build议使用强大且社区支持的解决scheme:

https://github.com/paulmillr/es6-shim

这是纯ES6 JS的polyfills库

请注意,这个库需要es5-shim,只要按照README.md。

 if(Number.isInteger(Number(data))){ //----- } 

你可以尝试Number.isInteger(Number(value))如果value可能是一个stringforms的整数,例如var value = "23" ,你希望它的计算结果为true 。 避免尝试Number.isInteger(parseInt(value))因为这不会总是返回正确的值。 例如,如果var value = "23abc"并使用parseInt实现,它仍然会返回true。

但是,如果你想严格的整数值,那么可能Number.isInteger(value)应该做的伎俩。

最简单,最干净的ECMAScript-6之前的解决scheme(即使将非数字值(例如string或空值)传递给该函数,该解决scheme也足够健壮以返回false,如下所示:

 function isInteger(x) { return (x^0) === x; } 

下面的解决scheme也可以工作,虽然不如上面那样高雅:

 function isInteger(x) { return Math.round(x) === x; } 

请注意 ,在上面的实现中Math.ceil()或Math.floor()可以同样使用(而不是Math.round())。

或者:

 function isInteger(x) { return (typeof x === 'number') && (x % 1 === 0); } 

一个相当常见的不正确的解决scheme如下:

 function isInteger(x) { return parseInt(x, 10) === x; } 

虽然这个基于parseInt的方法可以很好地处理x的许多值,但一旦x变得相当大,它将无法正常工作。 问题是parseInt()在parsing数字之前将其第一个参数强制转换为string。 因此,一旦数字变得足够大,其string表示将以指数forms呈现(例如1e + 21)。 因此,parseInt()将尝试parsing1e + 21,但是在到达e字符时将停止parsing,因此将返回值1.观察:

 > String(1000000000000000000000) '1e+21' > parseInt(1000000000000000000000, 10) 1 > parseInt(1000000000000000000000, 10) === 1000000000000000000000 false 

检查variables是否等于相同的variables四舍五入到一个整数,如下所示:

 if(Math.round(data) != data) { alert("Variable is not an integer!"); } 

Number.isInteger()是最好的方式,如果你的浏览器支持,如果不是的话,我认为有很多方法可以去:

 function isInt1(value){ return (value^0) === value } 

要么:

 function isInt2(value){ return (typeof value === 'number') && (value % 1 === 0); } 

要么:

 function isInt3(value){ return parseInt(value, 10) === value; } 

要么:

 function isInt4(value){ return Math.round(value) === value; } 

现在我们可以testing结果:

 var value = 1 isInt1(value) // return true isInt2(value) // return true isInt3(value) // return true isInt4(value) // return true var value = 1.1 isInt1(value) // return false isInt2(value) // return false isInt3(value) // return false isInt4(value) // return false var value = 1000000000000000000 isInt1(value) // return false isInt2(value) // return true isInt3(value) // return false isInt4(value) // return true var value = undefined isInt1(value) // return false isInt2(value) // return false isInt3(value) // return false isInt4(value) // return false var value = '1' //number as string isInt1(value) // return false isInt2(value) // return false isInt3(value) // return false isInt4(value) // return false 

所以,所有这些方法都是有效的,但是当数量非常大的时候,parseInt和^运算符就不能正常工作。

另外, Number.isInteger() 。 也许Number.isSafeInteger()是通过使用ES6指定的另一个选项。

要在ES6之前的浏览器中Number.isSafeInteger(..)

 Number.isSafeInteger = Number.isSafeInteger || function(num) { return typeof num === "number" && isFinite(num) && Math.floor(num) === num && Math.abs( num ) <= Number.MAX_SAFE_INTEGER; }; 

你可以使用regexp来完成这个工作:

 function isInteger(n) { return (typeof n == 'number' && /^-?\d+$/.test(n+'')); } 

你可以使用这个function:

 function isInteger(value) { return (value == parseInt(value)); } 

即使值是一个包含整数值的string,它也会返回true。
所以,结果将是:

 alert(isInteger(1)); // true alert(isInteger(1.2)); // false alert(isInteger("1")); // true alert(isInteger("1.2")); // false alert(isInteger("abc")); // false 

来自http://www.toptal.com/javascript/interview-questions

 function isInteger(x) { return (x^0) === x; } 

发现它是做到这一点的最佳方式。

使用| 运营商:

 (5.3 | 0) === 5.3 // => false (5.0 | 0) === 5.0 // => true 

所以,一个testing函数可能看起来像这样:

 var isInteger = function (value) { if (typeof value !== 'number') { return false; } if ((value | 0) !== value) { return false; } return true; }; 

这将解决多一个场景( 121. ),最后一点

 function isInt(value) { var ind = value.indexOf("."); if (ind > -1) { return false; } if (isNaN(value)) { return false; } var x = parseFloat(value); return (x | 0) === x; } 

对于不带分隔符的正整数值:

 return ( data !== '' && data === data.replace(/\D/, '') ); 

testing1.如果不为空,并且2.如果值等于在其值中replace非数字字符的结果。

函数isInteger(x){return(x ^ 0)=== x; }下面的解决scheme也可以工作,虽然不如那个优雅

以上:

函数isInteger(x){返回Math.round(x)=== x; }注意,在上面的实现中Math.ceil()或Math.floor()可以同样使用(而不是Math.round())。

或者:函数isInteger(x){return(typeof x ==='number')&&(x%1 === 0); }

一个相当常见的不正确的解决scheme如下:

函数isInteger(x){return parseInt(x,10)=== x; }

虽然这个基于parseInt的方法可以很好地处理x的许多值,但一旦x变得相当大,它将无法正常工作。 问题是parseInt()在parsing数字之前将其第一个参数强制转换为string。 因此,一旦数字变得足够大,其string表示将以指数forms呈现(例如1e + 21)。 因此,parseInt()将尝试parsing1e + 21,但是在到达e字符时将停止parsing,因此将返回值1.观察:

string(1000000000000000000000)'1e + 21'

parseInt(1000000000000000000000,10)1

parseInt(1000000000000000000000,10)=== 1000000000000000000000 false

我不得不检查一个variables(string或数字)是否是一个整数,我使用这个条件:

 function isInt(a){ return !isNaN(a) && parseInt(a) == parseFloat(a); } 

http://jsfiddle.net/e267369d/1/

其他一些答案也有类似的解决scheme(依靠parseFloatisNaN结合),但是我应该更直截了当,自我解释。


编辑:我发现我的方法失败的string包含逗号(如“1,2”),我也意识到,在我个人的情况下,我希望函数失败,如果一个string不是一个有效的整数(应失败任何浮动,甚至1.0)。 所以这里是我的functionMk II:

 function isInt(a){ return !isNaN(a) && parseInt(a) == parseFloat(a) && (typeof a != 'string' || (a.indexOf('.') == -1 && a.indexOf(',') == -1)); } 

http://jsfiddle.net/e267369d/3/

当然,如果你真的需要接受整数浮点数的函数(1.0的东西),你总是可以删除点条件a.indexOf('.') == -1

 function isInteger(argument) { return argument == ~~argument; } 

用法:

 isInteger(1); // true<br> isInteger(0.1); // false<br> isInteger("1"); // true<br> isInteger("0.1"); // false<br> 

要么:

 function isInteger(argument) { return argument == argument + 0 && argument == ~~argument; } 

用法:

 isInteger(1); // true<br> isInteger(0.1); // false<br> isInteger("1"); // false<br> isInteger("0.1"); // false<br> 

Lodash https://lodash.com/docs#isInteger (自4.0.0以来)有检查variables是否为整数的函数:

 _.isInteger(3); // → true _.isInteger(Number.MIN_VALUE); // → false _.isInteger(Infinity); // → false _.isInteger('3'); // → false 

经过一些成功和失败,我想出了这个解决scheme:

 const isInt = (value) => { return String(parseInt(value, 10)) === String(value) } 

我喜欢上面的检查值不是NaN和使用parseFloat的想法,但是当我在React基础结构中尝试它时,由于某种原因,它不工作。

编辑:我发现一个更好的方式,而不使用string:

 var isInt = function (str) { return str === '0' || !!~~str; } 

我认为这是最短的答案。 也许即使是最高效的,但我可以被纠正。 🙂

 var x = 1.5; if(!isNaN(x)){ console.log('Number'); if(x % 1 == 0){ console.log('Integer'); } }else { console.log('not a number'); } 

你可以使用正则expression式来做到这一点:

 function isInt(data){ if(typeof(data)=='number'){ var patt=/^[0-9e+]+$/; data=data+""; data=data.match(patt); if(data==null){return false;} else {return true;}} else{return false;} } 

如果数据不是整数,则返回false ,否则返回true

它适用于我..试试这个..

 $(document).on("input", ".numOnly", function(e) { this.value = this.value.replace(/[^0-9\$]/g,''); }); 

您可以使用按键,键控,keydown等,而不是input。