如何检查一个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(依靠parseFloat
和isNaN
结合),但是我应该更直截了当,自我解释。
编辑:我发现我的方法失败的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。