programing

JavaScript에서 변수가 정수인지 확인하는 방법

randomtip 2022. 10. 12. 21:20
반응형

JavaScript에서 변수가 정수인지 확인하는 방법

변수가 JavaScript에서 정수인지 확인하고 정수 아닐 경우 경보를 발생시키는 방법은 무엇입니까?시도했지만 작동하지 않습니다.

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

경우에 따라 문자열도 잠재적 정수로 캐스팅하시겠습니까?

이것으로 끝납니다.

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

물론, 나는 미니미니어가 그것을 처리하도록 할 것을 제안합니다.

다음과 같이 === 연산자(최소 등식)를 사용합니다.

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

Number.isInteger()★★★★★★★★★★★★★★★★★★★★★★★★★★

은 MDN을 하지 않는 .Number.isInteger()IE를 사용하다

MDN 페이지 링크

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

문제의 변수에 대해 아무것도 모르는 경우 다음 방법을 사용해야 합니다.

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

입력도 텍스트일 수 있지만 텍스트가 아닌 것을 먼저 확인하고 싶다면 먼저 유형을 확인할 수 있습니다.

var data = 22;

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

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

간단한 정규 표현을 사용할 수 있습니다.

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

ES6에서는 Number Object에 2개의 새로운 메서드가 추가되었습니다.

Number.isInteger() 메서드는 인수가 정수일 경우 true를 반환하고 그렇지 않을 경우 false를 반환합니다.

중요사항:메소드는 정수로 나타낼 수 있는 부동 소수점 번호에 대해서도 true를 반환합니다.예: 5.0(정확히 5와 같음)

사용 예:

Number.isInteger(0);         // true
Number.isInteger(1);         // true
Number.isInteger(-100000);   // true
Number.isInteger(99999999999999999999999); // true

Number.isInteger(0.1);       // false
Number.isInteger(Math.PI);   // false

Number.isInteger(NaN);       // false
Number.isInteger(Infinity);  // false
Number.isInteger(-Infinity); // false
Number.isInteger('10');      // false
Number.isInteger(true);      // false
Number.isInteger(false);     // false
Number.isInteger([1]);       // false

Number.isInteger(5.0);       // true
Number.isInteger(5.000000000000001); // false
Number.isInteger(5.0000000000000001); // true

우선, NaN은 숫자(이상한 것은 알고 있습니다.그냥 해 주세요)이지, 「기능」이 아닙니다.

변수 유형이 숫자인지 확인하고 정수를 확인하려면 계수를 사용합니다.

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

주의해서 사용하세요

숫자 % 1

빈 문자열("") 또는 부울(true 또는 false)이 정수로 반환됩니다.그러고 싶지 않을 수도 있어

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

Number.isInteger(데이터)

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

브라우저에 내장되어 있습니다.이전 브라우저 지원 안 함

다른 방법:

Math.round(num)=== num

단, 빈 문자열과 부울에 대해서도 Math.round()는 실패합니다.

포스터와 같은 정수가 원하는지 확인하려면:

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

ECMAScript-6 이전의 가장 간단하고 깨끗한 솔루션(문자열이나 늘 등의 숫자가 아닌 값이 함수에 전달되어도 false를 반환할 수 있을 정도로 충분히 강력합니다)은 다음과 같습니다.

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

위의 솔루션만큼 우아하지는 않지만 다음 솔루션도 작동합니다.

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

의 구현에서는 Math.round() 대신 Math.ceil() 또는 Math.floor()를 동일하게 사용할 수 있습니다.

또는 다음 중 하나:

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

도 언급하지 ?Number.isInteger()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger

에게 딱 맞아떨어져서 한다.NaN숫자를 시작합니다.

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

변수가 다음과 같이 정수로 반올림된 동일한 변수와 동일한지 확인합니다.

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

ECMA-262 6.0 (ES6) 표준에는 Number.isInteger 함수가 포함되어 있습니다.

오래된 브라우저에 대한 지원을 추가하려면 다음과 같은 강력한 커뮤니티 지원 솔루션을 사용할 것을 강력히 권장합니다.

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

순수 ES6 JS 폴리필 라이브러리입니다.

이 lib에는 es5-shim이 필요합니다.README.md 를 참조해 주세요.

int/float와 알파벳을 확인해야 했기 때문에 Accepted answer를 사용할 수 없었습니다.그래서 int/paramet 체크와 알파벳 체크에 모두 효과가 있습니다.

function is_int(value){
        if( (parseInt(value) % 1 === 0 )){
            return true;
        }else{
            return false;
        }
}

사용.

is_int(44);   // true
is_int("44");   // true
is_int(44.55);  // true
is_int("44.55");  // true
is_int("aaa");  // false  

다음 기능을 사용할 수 있습니다.

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

하다를 사용하세요.|연산자:

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

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

이 방법들은 모두 효과가 있지만 숫자가 매우 클 경우 구문 분석을 수행합니다.int 및 ^ 연산자가 제대로 작동하지 않습니다.

시도해 보세요.Number.isInteger(Number(value))한다면value문자열 형식의 정수일 수 있습니다.var value = "23"그리고 당신은 이것을 평가하기를 원한다.true. 시도를 피하다Number.isInteger(parseInt(value))항상 정확한 값을 반환하지는 않기 때문입니다.예:var value = "23abc"를 사용합니다.parseInt구현은 여전히 사실로 반환될 것입니다.

하지만 엄밀하게 정수 값을 원한다면Number.isInteger(value)효과가 있을 거야

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

나의 접근법:

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

큰 정수는 어떨까요?bigint)?

다음 응답의53 대부분은 큰 정수(2 이상)에서 실패합니다.비트 테스트(예:(x | 0) === x테스트typeof x === 'number', 통상의 int 기능(예:parseInt), 큰 정수에서는 일반 산술이 실패합니다.이 문제는 를 사용하여 해결할 수 있습니다.

결과를 보여주기 위해 여러 개의 답을 하나의 토막으로 정리했습니다.대부분의 경우 큰 정수로 완전히 실패하지만, 다른 정수는 해당 유형을 통과한 경우를 제외하고 작동합니다.BigInt(예:1n중복되는 답변은 기재하지 않았습니다.또 소수점 이하를 사용할 수 있는 답변이나 테스트 타입을 시도하지 않는 답변도 기재되어 있지 않습니다.)

// these all fail
n = 1000000000000000000000000000000
b = 1n

// These all fail on large integers
//https://stackoverflow.com/a/14636652/3600709
console.log('fail',1,n === parseInt(n, 10))
//https://stackoverflow.com/a/14794066/3600709
console.log('fail',2,!isNaN(n) && parseInt(Number(n)) == n && !isNaN(parseInt(n, 10)))
console.log('fail',2,!isNaN(n) && (parseFloat(n) | 0) === parseFloat(n))
console.log('fail',2,!isNaN(n) && (function(x) { return (x | 0) === x; })(parseFloat(n)))
//https://stackoverflow.com/a/21742529/3600709
console.log('fail',3,n == ~~n)
//https://stackoverflow.com/a/28211631/3600709
console.log('fail',4,!isNaN(n) && parseInt(n) == parseFloat(n))
//https://stackoverflow.com/a/41854178/3600709
console.log('fail',5,String(parseInt(n, 10)) === String(n))

// These ones work for integers, but not BigInt types (e.g. 1n)
//https://stackoverflow.com/a/14636725/3600709
console.log('partial',1,typeof n==='number' && (n%1)===0) // this one works
console.log('partial',1,typeof b==='number' && (b%1)===0) // this one fails
//https://stackoverflow.com/a/27424770/3600709
console.log('partial',2,Number.isInteger(n)) // this one works
console.log('partial',2,Number.isInteger(b)) // this one fails
//https://stackoverflow.com/a/14636638/3600709
console.log('partial',3,n % 1 === 0)
console.log('partial',3,b % 1 === 0) // gives uncaught type on BigInt

조회유형

실제로 착신 값의 유형을 테스트하여 정수인지 확인하려면 대신 다음을 사용하십시오.

function isInt(value) {
    try {
        BigInt(value)
        return !['string','object','boolean'].includes(typeof value)
    } catch(e) {
        return false
    }
}

function isInt(value) {
    try {
        BigInt(value)
        return !['string','object','boolean'].includes(typeof value)
    } catch(e) {
        return false
    }
}

console.log('--- should be false')
console.log(isInt(undefined))
console.log(isInt(''))
console.log(isInt(null))
console.log(isInt({}))
console.log(isInt([]))
console.log(isInt(1.1e-1))
console.log(isInt(1.1))
console.log(isInt(true))
console.log(isInt(NaN))
console.log(isInt('1'))
console.log(isInt(function(){}))
console.log(isInt(Infinity))

console.log('--- should be true')
console.log(isInt(10))
console.log(isInt(0x11))
console.log(isInt(0))
console.log(isInt(-10000))
console.log(isInt(100000000000000000000000000000000000000))
console.log(isInt(1n))


유형 확인 안 함

착신 타입이 실제로 부울, 문자열 등이 수치로 변환되는지 여부에 관계없이 다음을 사용합니다.

function isInt(value) {
    try {
        BigInt(value)
        return true
    } catch(e) {
        return false
    }
}

function isInt(value) {
    try {
        BigInt(value)
        return true
    } catch(e) {
        return false
    }
}

console.log('--- should be false')
console.log(isInt(undefined))
console.log(isInt(null))
console.log(isInt({}))
console.log(isInt(1.1e-1))
console.log(isInt(1.1))
console.log(isInt(NaN))
console.log(isInt(function(){}))
console.log(isInt(Infinity))

console.log('--- should be true')
console.log(isInt(10))
console.log(isInt(0x11))
console.log(isInt(0))
console.log(isInt(-10000))
console.log(isInt(100000000000000000000000000000000000000))
console.log(isInt(1n))
// gets converted to number
console.log(isInt(''))
console.log(isInt([]))
console.log(isInt(true))
console.log(isInt('1'))

게다가.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;
};

이것만 시험해 보세요.

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

'승인된' 답변이 잘못되었습니다(아래 일부 댓글에서 지적한 바와 같이).이 수정에 의해서, 다음과 같이 동작합니다.

if (data.toString() === parseInt(data, 10).toString())
    alert("data is a valid integer")
else
    alert("data is not a valid integer")

여기에는 regexp를 사용할 수 있습니다.

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

http://www.toptal.com/javascript/interview-questions 에서 :

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

이게 최선의 방법이라는 걸 깨달았어요

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>

이렇게 하면 시나리오(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;

    }

언급URL : https://stackoverflow.com/questions/14636536/how-to-check-if-a-variable-is-an-integer-in-javascript

반응형