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가장 해키 한 방법을 고수하는 것이 좋습니다 .
벤자민 Gruenbaum

@Benjamim 숫자가 정수로 변환 될 수있는 문자열이면 어떻게 되나요? HTML에서는 모든 것이 문자열입니다. 그래서 Number.isInteger ( "69")는 거짓입니다
joedotnot

답변:


344

아래와 같이 === 연산자 ( strict equality )를 사용하십시오.

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
위의 코드를 통해 예제를 실행하면 정수로 표시되고 다른 정수는 그렇지 않은 것으로 경고합니다 .NaN의 경우 NaN의 유형도 pareInt의 반환 값 유형과 다릅니다 () .....
pranag

1
좀 더 자세히 설명해 주시겠습니까? "example"은 parseInt를 사용하면 typeof 키워드 및 모듈러스 연산자를 사용하는 것보다 성능이 저하된다는 것을 보여줍니다. 하지만 난 당신이 (! NaN이 = NaN의)에 대해 지금 무엇을 의미하는지 볼 수 있습니까
블래 이크 레 갈리아

4
자바 스크립트에서 @connorbode 모든 숫자는 같은 유형을 가지고 (float 또는 double이 없습니다), 2.0 === 2불필요한 소수는 같은 숫자의 다른 표현이기 때문에 사실 parseInt(2.0) === 2.0과 동일 parseInt(2) === 2합니다
Michael Theriot

1
@BlakeRegalia은 : 빠른되고 있지만 그 방법은 하지 않는 이 답변에서 가능한 모든 값을 전달 : stackoverflow.com/a/14794066/843732
C00000FD

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

물론, 나는 축소 장치가 그것을 처리하게하는 것이 좋습니다.


4
@krisk-여러 솔루션으로 상향 조정되었습니다. 또한 제공 한 4 가지 변형 인 jsperf.com/tfm-is-integer 에 대해 빠른 테스트를 수행했으며 단락 솔루션의 성능이 가장 우수함 을 확인했습니다.
tfmontague

1
그것은 2099999999999999에 거짓을 반환하는 것 : - (
jkucharovic

1
@jkucharovic 비트 OR 연산자는 범인입니다. 비트가 아닌 버전을 사용하면 true가 반환됩니다.
krisk

1
이것은 '2'를 만듭니다. true로 평가
cyberwombat 2016 년

1
@cyberwombat 10 진수 2.0 :-)
Kuba Beránek

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
무슨 소리 야? 이것은 자바 스크립트에서 데이터 유형을 확인 "1.0"하고 문자열이므로 숫자가 아닙니다. 그렇지 않으면 1변수를 설정하면 변수의 값 var my_var=1.0;이됩니다.이 함수는 정수로 올바르게 식별됩니다.
Blake Regalia

4
곧, Number.isInteger()작동 할 것입니다 ... 그때까지, 이것은 그것을하는 좋은 방법입니다
Claudiu

Number.isInteger가 작동하지 않습니다. 나는 뭔가 잘못하고 있어야합니다. Blake의 솔루션 % 1이 (가) 완벽하게 작동합니다.
mcmacerson

104

Number.isInteger() 갈 길인 것 같습니다.

또한 MDN은 Number.isInteger()주로 모든 버전의 IE를 지원하지 않는 브라우저에 다음과 같은 폴리 필을 제공했습니다 .

MDN 페이지로 연결

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

2
MDN은 9007199254740992에 대한 테스트를 제거했습니다
Bernhard Döbler

2
이것은 가장 간단하고 "올바른"답변입니다. JavaScript에는 이미 정수를 검사하는 방법이 있습니다. 새로운 것을 쓸 필요가 없습니다. isNaN ()은 정수가 아닌 숫자를 테스트합니다.
globewalldesk

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콘솔에서 실행하십시오 . returns true0 % 1반환합니다 0.
Nope

IE에서 사용해 보셨습니까?
Codebeat

1
@Erwinus : IE9, IE8 및 IE7 호환 모드로 0 % 1돌아갑니다 0.
Nope

오래된 IE에서 사용해보십시오. 게다가 항상 0을 확인하고 브라우저에서 수행 할 작업에 의존하지 않는 좋은 프로그래밍 방법입니다.
Codebeat

62
@ Erwinus : 나는 당신이 당신의 사실을 혼란스럽게 생각합니다. 당신이 나눌 때 제로 오류에 의한 부문의 발생 에 의해 당신이 숫자 제로를 분할하지 않을 때 제로. IE 버전과는 전혀 관련이 없습니다.
Nope


15

우선, NaN은 "숫자"(예, 이상하다는 것을 알고 있습니다. 그냥 롤링)는 "함수"가 아닙니다.

변수 유형이 숫자인지 확인하고 정수를 확인하려면 모듈러스를 사용해야합니다.

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

2
alert (typeof data == 'number'&& (data == 0 || data % 1 == 0))이어야합니다. 0으로 나누기를 피하십시오.
Codebeat

19
@Erwinus 0 % 1은 여전히 ​​1로 나눕니다.
Phil

@Phil은로 (0 == 0 || 0 % 1 == 0)평가됩니다 true.
tomekwi

아, 그건 그렇고 0 % 1 == 0평가 true! %분할이 아닙니다!
tomekwi

13

사용하는 동안 조심

숫자 % 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))않습니까?
스위스 미스터


6

가장 간단하고 깨끗한 사전 ECMAScript-6 솔루션 (문자열 또는 널과 같은 숫자가 아닌 값이 함수에 전달되는 경우에도 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; }

이 구문 분석 기반 접근 방식은 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/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger

나를 위해 완벽하게 작동하고 NaN시작 숫자로 문제를 해결합니다 .


1
이것은 ES6이므로 IE <= 11과 같은 이전 브라우저는 지원하지 않습니다. 위의 문서는 폴리 필을 제공합니다.
주교

누군가가 언급했던 Number.isInteger()3.5 년 전에, : stackoverflow.com/a/27424770/5208540
알렉스 Stragies

입력에서 값을 가져오고 검사하면 Number.isInteger는 입력 값이 문자열 데이터 유형이므로 항상 false를 반환합니다.
Shinigamae

6

ES6에서는 Number Object에 새로운 방법이 추가되었습니다.

인수가 정수이면 Number.isInteger () 메소드는 true를 리턴합니다.

사용법 예 :

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

4

ECMA-262 6.0 (ES6) 표준에는 Number.isInteger 기능이 포함 됩니다.

이전 브라우저에 대한 지원을 추가하려면 다음과 같은 강력한 커뮤니티 지원 솔루션을 사용하는 것이 좋습니다.

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

이것은 순수한 ES6 JS polyfills 라이브러리 입니다.

이 라이브러리에는 es5-shim이 필요합니다. README.md를 따르십시오.


4

예를 들어 문자열 형식의 정수일 Number.isInteger(Number(value))경우 시도 할 value수 있으며 var value = "23"이것을 평가하려고 true합니다. Number.isInteger(parseInt(value))항상 올바른 값을 반환하지는 않으므로 시도하지 마십시오 . 예를 들어 구현 var value = "23abc"을 사용하는 경우 parseInt여전히 true를 반환합니다.

그러나 정수 값을 엄격히 원한다면 아마도 Number.isInteger(value)트릭을 수행해야합니다.


1
이것은 IE에서 지원되지 않습니다. docu에 여기에 명시된 바와 같이 , 특히 확인하려는 var가 정의되지 않은 경우 이로 인해 scrip이 중지되었습니다.
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!");
}

당신은 아주 쉽게 복귀와 함께이 기능의 문제를 해결할 수 true에 대해 NaN간단하게 변경하여, !=!==와 반전 if블록. 이것은 NaNJavaScript에서 유일하지 않은 유일한 값 이기 때문에 작동 합니다. 예를 들어, 새 코드는 다음과 같아야합니다.if (Math.round(x) === x) { /* x IS an integer! */ }
mgthomas99

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
}

Number.isInteger ()는 모든 버전의 IE 브라우저에서 지원되지 않습니다.
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
좋은 생각! 또한 테스트를 보여 주었지만 불행히도 문자열 값 "0"을 고려하지 않습니다.
Jammer

@vsync, 의도적으로 아닙니다. 나는 원래 upvote했지만 이전의 의견 때문에 그것을 되돌리기로 결정했습니다. 실수로 두 번 클릭 했어야합니다.
Jammer

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. 값이 숫자가 아닌 문자를 대체 한 결과와 같은 경우 2.


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 "기능이 아님"은 무슨 뜻입니까? oO 나는 "테스트 방법"을 사용한다고 썼다.
Vasyl Gutnyk

@imlokesh 아니 문제, 난 그냥 U 생산에 그것을 사용하는 원인을 물어 :) 그리고 나는 어떤 버그를 발견 생각 :)
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
콜린 Breame

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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.