如何在JavaScript中检查变量是否为整数?


405

如何检查JavaScript中的变量是否为整数,如果不是,则引发警报?我试过了,但是不起作用:

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

2
一种可能性是使用parseInt
Paul

2
jsben.ch/#/htLVw-常用方法的基准
-EscapeNetscape

这里的所有答案真的过时了。今天,我建议坚持使用Number.isInteger这是最简单的方法。
本杰明·格伦鲍姆

@Benjamim如果数字是可以转换为整数的字符串怎么办?在HTML一切是一个字符串..所以Number.isInteger(“69”)是假的
joedotnot

Answers:


344

使用===运算符(严格等于),如下所示,

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

95
将NaN视为整数。同样不利于我的方法。jsperf.com/numbers-and-integers
Blake Regalia

2
如果通过上面的代码运行示例,则会发出a作为整数,而另一个警告不是整数的情况,如果是NaN,NaN的类型也不同于pareInt返回值的类型()....
普拉纳格2013年

1
你能详细说明一下吗?“示例”仅表明使用parseInt产生的性能比使用typeof关键字和模运算符差。但我确实了解您的意思(NaN!= NaN)
Blake Regalia

4
JavaScript中的@connorbode所有数字都具有相同的类型(没有浮点数或双精度数),因此2.0 === 2由于不必要的小数点只是同一数字的不同表示,因此parseInt(2.0) === 2.0等同于parseInt(2) === 2真实的情况
Michael Theriot 2014年

1
@BlakeRegalia:尽管速度很快,但他的方法并未通过此答案传递所有可能的值:stackoverflow.com/a/14794066/843732
c00000fd 2014年

506

这取决于您是否还希望将字符串也转换为潜在整数?

这样可以:

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

使用按位运算

简单的解析和检查

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

短路并保存解析操作:

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))
}

测试:

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/

性能

测试表明,该短路解决方案具有最佳性能(ops / sec)。

// 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

如果您喜欢较短,钝角的短路形式:

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

当然,我建议让Minifier处理。


4
@krisk-支持多种解决方案。还对您提供的4个变体进行了快速测试:jsperf.com/tfm-is-integer-确定短路解决方案具有最佳性能。
tfmontague

1
它在2099999999999999上返回false:-
jkucharovic

1
@jkucharovic按位或运算符是元凶。使用非按位版本将返回true。
krisk

1
这就是“ 2”。评估为真实
cyberwombat

1
@cyberwombat好吧,它是一个十进制数字2.0 :-)
库巴·

120

假设您对所讨论的变量一无所知,则应采用以下方法:

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
}

8
你什么意思?这会检查javascript中的数据类型,它"1.0"是一个字符串,因此不是数字。1如果这样设置,否则将是变量的值,var my_var=1.0;此函数正确将其标识为整数。
Blake Regalia

4
很快,Number.isInteger()它将起作用……直到那时,这是一个很好的方法
Claudiu

Number.isInteger对我不起作用。我一定做错了什么。布莱克的解决方案%1完美运行。
mcmacerson

104

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

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

链接到MDN页面

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

2
MDN对9007199254740992测试去除
伯恩哈德Döbler

2
这是最直接,最“正确”的答案。我的意思是,JavaScript已经有了检查整数的方法。无需编写新的。isNaN()测试数字,而不是整数。
globewalldesk '19

66

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

var data = 22;

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

请注意,如果您输入的内容也可以是文本,并且您要首先检查它是否不是文本,那么可以先检查类型:

var data = 22;

if(typeof data === 'number'){
     // yes it is numeric

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

3
@Erwinus:0 % 1 === 0在控制台中运行 。它true作为0 % 1回报返回0
2013年

您在IE中尝试过吗;-)
Codebeat 2013年

1
@Erwinus:0 % 1返回0在IE9,IE8和IE7兼容模式。
Nope 2013年

在真正的旧IE中尝试一下。此外,它始终是检查零而不依赖于浏览器做什么的好方法。
2013年

62
@Erwinus:我认为您混淆了事实。当您零除不是用数字除零时,会导致被零除错误。与IE版本完全无关。
Nope


15

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

您需要检查变量的类型是否为数字,并且要检查整数我将使用模数。

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

2
应该是:alert(typeof data =='number'&&(data == 0 || data%1 == 0)); 避免被零除。
2013年

19
@Erwinus 0%1仍被1除。–
Phil

@Phil (0 == 0 || 0 % 1 == 0)将评估为true
tomekwi 2015年

呵呵,顺便0 % 1 == 0还算true%不是师!
tomekwi 2015年

13

使用时要小心

num%1

空字符串('')或布尔值(true或false)将作为整数返回。您可能不想这样做

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

Number.isInteger(数据)

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

浏览器中的内置功能。Dosnt支持较旧的浏览器

备择方案:

Math.round(num)=== num

但是,对于空字符串和布尔值,Math.round()也将失败


8

要检查像海报这样的整数是否要:

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

在数据前注意+(将字符串转换为数字),而===表示精确。

以下是示例:

data=10
+data===parseInt(data)
true

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

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

6
对于我的情况,这似乎是最聪明的解决方案(我不在乎它是否是字符串中的整数)。但是:为什么不去return (+data===parseInt(data))呢?
瑞士先生2014年


6

以下是最简单,最干净的ECMAScript-6之前的解决方案(即使将非数字值(例如字符串或null)传递给该函数,它也足够健壮以返回false):

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

以下解决方案也可以使用,尽管不如上面的解决方案那么优雅:

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

注意,在上述实现中,可以很好地使用Math.ceil()或Math.floor()(而不是Math.round())。

或者:

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

一种相当普遍的错误解决方案如下:

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

尽管这种基于parseInt的方法对于x的许多值都可以很好地工作,但是一旦x变得很大,它将无法正常工作。问题在于parseInt()在解析数字之前将其第一个参数强制转换为字符串。因此,一旦数字变得足够大,其字符串表示形式将以指数形式(例如1e + 21)呈现。因此,parseInt()然后将尝试解析1e + 21,但是在到达e字符时将停止解析,因此将返回值1。请注意:

> String(1000000000000000000000)
'1e+21'

> parseInt(1000000000000000000000, 10)
1

> parseInt(1000000000000000000000, 10) === 1000000000000000000000
false

6

为什么没有人提到 Number.isInteger()

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger

非常适合我,并NaN以数字开头解决问题。


1
请注意,这是ES6,因此较旧的浏览器(例如IE <= 11)不支持它。上面的文档提供了一个polyfill。
主教

有人提到您Number.isInteger(),比您早3.5年:stackoverflow.com/a/27424770/5208540
Alex Stragies

如果我们要从输入中捕获值,则检查,Number.isInteger将始终返回false,因为输入值是字符串数据类型
Shinigamae

6

在ES6中,为Number Object添加了2种新方法。

如果参数为整数,则Number.isInteger()方法在其中返回true。

用法示例:

Number.isInteger(10);        // returns true
Number.isInteger(10.5);      // returns false


4

您可以尝试Number.isInteger(Number(value))是否value使用字符串形式的整数,例如,var value = "23"并且希望该值求和true。避免尝试,Number.isInteger(parseInt(value))因为这不会总是返回正确的值。例如,如果var value = "23abc"您使用parseInt实现,它将仍然返回true。

但是,如果您想要严格的整数值,那么Number.isInteger(value)应该可以解决问题。


1
请注意,IE不支持此功能。如此 处在文档中所述,我因此而停止了股票交易,尤其是如果您要检查的var未定义
mikewasmike

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

3
在获得29个答案之后,您可能会希望得到更多的解释才能使您的答案脱颖而出...
brasofilo

3

检查变量是否等于舍入为整数的相同变量,如下所示:

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

您可以通过简单地更改为并反转这些块,轻松地通过返回truefor来解决此函数的问题。之所以可行,是因为这是JavaScript中唯一不等于自身的值。例如,新代码应为NaN!=!==ifNaNif (Math.round(x) === x) { /* x IS an integer! */ }
mgthomas99 '17

3

此外,Number.isInteger()。也许这里Number.isSafeInteger()是另一个选择通过使用ES6规范,。

Number.isSafeInteger(..)在ES6之前的浏览器中填充:

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

3

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; 
}

现在我们可以测试结果:

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和^运算符将无法正常工作。


3

尝试一下:

let number = 5;
if (Number.isInteger(number)) {
    //do something
}

并非所有版本的IE浏览器都支持Number.isInteger()。
SKR

2

您可以使用以下功能:

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

即使该值是包含整数值的字符串,也将返回true。
因此,结果将是:

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

2

我的方法:

a >= 1e+21测试只能通过必须为数字的值,并且非常大。这肯定会涵盖所有情况,这与本讨论中提供的其他解决方案不同。

a === (a|0)如果给定函数的参数与按位转换的值完全(===)相同,则表示该参数是整数。

a|0将返回0对于任何值a不是数字,如果a确实是一个数字,它会在小数点后剥去任何东西,所以1.0001会成为1

function isInteger(a){
    return a >= 1e+21 ? true : a === (a|0)
}

/// tests ///////////////////////////
[
  1,                        // true
  1000000000000000000000,   // true
  4e2,                      // true
  Infinity,                 // true
  1.0,                      // true
  1.0000000000001,          // false
  0.1,                      // false
  "0",                      // false
  "1",                      // false
  "1.1",                    // false
  NaN,                      // false
  [],                       // false
  {},                       // false
  true,                     // false
  false,                    // false
  null,                     // false
  undefined                 // false
].forEach( a => console.log(typeof a, a, isInteger(a)) )


1
好主意!我也喜欢您显示了测试,但不幸的是,这没有考虑String值“ 0”。
Jammer '18

嘿@vsync,不是故意的。我本来是赞成的,但由于先前的评论,决定将其还原。我一定不小心双击了它。
Jammer '18

1

您可以为此使用regexp:

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


1

使用|运算符:

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

因此,测试功能可能如下所示:

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

  if ((value | 0) !== value) {
    return false;
  }

  return true;
};

1

这将解决另一种情况(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;

    }

1

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

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

测试1.如果不为空,则测试2.如果value等于其值中替换非数字char的结果。


1

好的,原因是没有描述我的示例,所以更多示例:):

我使用正则表达式和测试方法:

var isInteger = /^[0-9]\d*$/;

isInteger.test(123); //true
isInteger.test('123'); // true
isInteger.test('sdf'); //false
isInteger.test('123sdf'); //false

// If u want to avoid string value:
typeof testVal !== 'string' && isInteger.test(testValue);

减去可能是因为测试不是一个功能。
imlokesh

@imlokesh您是什么意思“不是函数”?我写我用“测试方法”。
Vasyl Gutnyk

@imlokesh没问题,我只是问你,因为我在生产中使用了它:),我以为你发现了一些错误:)
Vasyl Gutnyk

1

你也可以这样尝试

var data = 22;
if (Number.isInteger(data)) {
    console.log("integer");
 }else{
     console.log("not an integer");
 }

要么

if (data === parseInt(data, 10)){
    console.log("integer");
}else{
    console.log("not an integer");
}

这将为产生错误的结果data=22.5;。而且两个分支机构都有console.log("not an integer"):: S
Colin Breame '18

0

我必须检查变量(字符串或数字)是否为整数,并使用了以下条件:

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

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

一些其他的答案中有一个类似的解决方案(依靠parseFloat联合isNaN),但是我的应该更直接,更容易解释。


编辑:我发现我的方法对于包含逗号的字符串失败(例如“ 1,2”),并且我还意识到在我的特殊情况下,如果字符串不是有效的整数,我希望函数失败(应该在任何浮点数上失败) ,甚至是1.0)。这是我的功能Mk 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.