숫자가 부동 또는 정수인지 어떻게 확인합니까?


717

어떻게 숫자입니다 찾기하는 floatinteger?

1.25 --> float  
1 --> integer  
0 --> integer  
0.25 --> float

47
나는 당신이 여기에 무엇을 요구하는지 이해하지만, 분명합니다 : <nit-pick>JavaScript에는 다른 정수 및 부동 숫자 유형이 없습니다. JavaScript의 모든 숫자는 단지입니다 Number. </nit-pick>
Matt Ball

4
Infinity당신이 걱정하고 멀리로 정수 또는 정수가 아닌 값은? 여기의 답변은이 점수에 고르게 분포되어 있습니다.
Mike Samuel

11
@MikeSamuel 수학적으로 정확하려면 : 무한대는 실수가 아니며 모든 정수는 실수 Infinity이므로 정수로 간주 할 수 없습니다.
rvighne

@ rvighne, 질문은 "실제"가 아니라 "float"에 대해 묻습니다. 어느 쪽이든 컴퓨터는 계산 가능한 숫자 만 나타낼 수 있기 때문에 실수는 관련이 없습니다 .
Mike Samuel

2
@rvighne, 나는 무한대와 NaN이 실수가 아니라는 사실은 IEEE-754 부동 소수점이 실수의 하위 집합이 아님을 의미한다고 생각합니다. IEEE-754에 기반한 모든 수치 분석은이 사실을 처리해야합니다. 내가 이해하지 못하는 것은이 사실이 is_integral이 wrt 카디널리티에서 어떻게 동작해야하는지 결정하는 방법입니다. 개인적으로 ((x % 1) == 0)은 좋은 프록시이며 IEEE-754에 의해 완전히 지정되어 있기 때문에 다른 번호 줄 사이의 통신에 대해 논쟁 할 필요가 없습니다.
Mike Samuel

답변:


1255

1로 나눌 때 나머지를 확인하십시오.

function isInt(n) {
   return n % 1 === 0;
}

인수가 숫자인지 모른다면 두 가지 테스트가 필요합니다.

function isInt(n){
    return Number(n) === n && n % 1 === 0;
}

function isFloat(n){
    return Number(n) === n && n % 1 !== 0;
}

이 답변이 작성된 후 5 년이 지난 2019업데이트 된 솔루션은 ECMA Script 2015에서 표준화되었습니다.이 솔루션은 이 답변에서 다룹니다 .


138
조심해,이 또한 빈 문자열 true를 돌려줍니다 정수를 나타내는 캐릭터 라인, true, false, null, 하늘의 배열, 어쩌면 하나의 정수, 정수를 나타내는 문자열을 포함하는 배열 등을 포함하는 배열입니다.
Dagg Nabbit

17
멋진 트릭하지만 그것은 빈 문자열 확인 실패로 정답 ""1.0 isInt("");&& isInt(1.0);모두 결과 true참조이 데모 jsbin.com/elohuq/1/edit
챔프

9
즉, ===를 사용하는 것이 일반적으로 ==보다 권장됩니다. 더 많은 유형 안전성과 더 예측 가능하고 균일 한 동작으로 이어지기 때문입니다. 이전 답변자가 언급 했듯이이 답변은 100 % 잘못되었습니다. null, 빈 문자열, 1.0 및 기타 수많은 값은 모두 정수로 잘못 등록됩니다 (=== 점검으로도).
whoblitz

54
문제는 숫자가 정수인지 확인하는 방법이 아니라 값을 확인하는 방법이 아닙니다.
kennebec

24
문자열의 유효성을 검사하지 않는 방법에 대한 많은 적대적인 의견. 그것은 OP의 질문의 일부가 아닙니다. SO의 배열의 마지막 요소를 검색하는 것에 대한 질문을하고 누군가가 대답하는 function last (array) { return array[array.length - 1]; }경우 인수가 배열인지 먼저 확인하지 않기 때문에 "정확하지 않은"또는 "SO에 대한 최악의 대답"입니까? 예, 인수를 확인하는 것이 좋습니다.하지만 개발자의 책임입니다. 따라서 답변은 짧아야하며 가능한 한 명확하게 질문에 직접 답변해야합니다.
M Miller

150

이 함수를 사용하여 값이 소수 부분이없고 정확한 정수로 표시 될 수있는 크기 한계 내에있는 숫자 기본 값인지 테스트하십시오.

function isFloat(n) {
    return n === +n && n !== (n|0);
}

function isInteger(n) {
    return n === +n && n === (n|0);
}

5
heh awesom exploit, 그것은 내 것이지만 ( n===+n숫자를 확인 n|0하고 반올림), 내장 연산자가 있습니다. 펑키
Claudiu

7
@John Hartsock 문자열은 절대 숫자 값이 될 수 없습니다. 문자열입니다. 이 함수의 요점은 값이 소수 부분이없고 정확한 정수로 표현할 수있는 크기 한계 내에있는 Javascript 숫자 값인지 테스트하는 것입니다. 문자열을 확인하여 숫자를 나타내는 일련의 문자가 포함되어 있는지 확인하려면 parseFloat()먼저 전화를 겁니다 .
Pointy

4
@ John Hartsock : 숫자 프리미티브가 전달되지 않으면 true를 반환하지 않습니다. 함수의 이름이 주어진 것이 의미가 있다고 생각합니다. 이러한 함수가 작성되는 경우 다른 것은 isString, isBoolean 등의 후보 여야합니다.
Dagg Nabbit

4
@Pointy : 배정 밀도 부동 소수점은 정확히 2 ^ 53까지의 정수 값을 나타낼 수 있습니다. 따라서 OP가 수학 의미 (정수) 또는 32 비트 데이터 의미에서 정수를 요구하는지 여부에 달려 있습니다. 후자라면 솔루션이 완벽합니다.
djd

8
자바 스크립트에서 |(OR) 과 같은 비트 연산자 는 부호있는 32 비트 정수에서만 작동합니다. 서명 된 int32 값을 확인하는 것이 목표 인 경우 OP에 표시되지 않습니다. 따라서 범위를 벗어난 숫자로는 작동하지 않습니다. 잘못된 isInteger(5000000000)것을 반환합니다 false!
Onur Yıldırım

93

왜 이런 식으로하지?

var isInt = function(n) { return parseInt(n) === n };

이것은 실제로 좋은 솔루션의 핵심입니다. 양의 정수를 허용하고 부동 소수점, 문자열 및 음수를 허용하지 않아야했습니다.
Imran-UK

4
이것은이 스레드의 다른 솔루션보다 훨씬 더 나은 솔루션 인 것 같습니다. 커뮤니티가 아마도 비판을 제공 할 수 있습니까?
sbichenko

5
var y = 1.00; y === parseInt (y, 10); // 이것은 나에게 true를 반환하는데, 이것은 실제로 우리가 원하는 것이 아닙니다.
whoughton

내가 볼 수있는 유일한 "단점"은 주어진 숫자 n가에 의해 문자열로 변환된다는 것 parseInt입니다. MDN을 참조하십시오 . 그러나이 솔루션을 사용합니다. :)
RhinoDevel 10

2
@ ekussberg : 왜 거짓을 반환해야합니까? 1은 정수입니다. 두 번째 인수 인 02는 무시됩니다.
Flimzy 2019

88

Number.isInteger()IE 이외의 모든 것에 현재 구현되어 있는 메소드 가 있습니다. MDN 은 다른 브라우저를위한 폴리 필도 제공합니다.

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

그러나 대부분의 사용 사례의 경우 Number.isSafeInteger 값을 너무 높거나 낮게 설정하여 소수점 이하 자릿수가 손실되었는지 확인하는 것이 좋습니다. MDN 에는 이에 대한 폴리 파일도 있습니다. (또한 isInteger위 의 pollyfill이 필요합니다 .)

if (!Number.MAX_SAFE_INTEGER) {
    Number.MAX_SAFE_INTEGER = 9007199254740991; // Math.pow(2, 53) - 1;
}
Number.isSafeInteger = Number.isSafeInteger || function (value) {
   return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
};

이것은 현재 Chrome에서도 작동하며 아마도 앞으로 나아갈 길입니다
Dukeatcoding

1
제 생각에는 최고의 솔루션입니다.
Automatico

1
폴리 필이 포함 된 솔루션은 가장 신뢰할 수 있고 간단한 솔루션입니다.
Francesco Pasa

2
@SergeyPanfilov 12.0 ∈ ℤ.
Константин Ван

1
이 답변이 제공된 이후 사양이 변경되었는지는 알지 못하지만 위의 기능은에 대한 올바른 polyfill이 아닙니다 Number.isInteger. 그러나에 대한 올바른 폴리 필입니다 Number.isSafeInteger. Number.isInteger숫자가 "안전 정수"인지 여부를 확인해서는 안됩니다. MDN : isIntegerisSafeInteger를 참조하십시오 .
nunocastromartins

33

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

function isInt(value) {

    var er = /^-?[0-9]+$/;

    return er.test(value);
}

또는 필요에 따라 아래 기능도 사용할 수 있습니다. 그것들은 PHPJS Project에 의해 개발되었습니다 .

is_int() => 변수 유형이 정수인지, 내용이 정수인지 확인

is_float() => 변수 유형이 부동인지 그리고 내용이 부동인지 확인

ctype_digit() => 변수 유형이 문자열인지, 내용에 10 진수 만 있는지 확인하십시오.

업데이트 1

이제 @ChrisBartley 의견에 감사드립니다 .


1
간단한 부호없는 정수를 테스트하는 데 적합합니다.
tothemario

7
하나의 라이너 :/^[0-9]+$/.test(String(value))
tothemario

짧고 약간 읽기 어려운 원 라이너 :/^[0-9]+$/.test(''+value)
skeggse

3
음의 정수를 처리하지 않습니다. test ()가 부울을 반환하므로 삼항 연산자가 필요하지 않습니다. return /^-?\d+$/.test(String(value));
Chris Bartley

@ChrisBartley, 감사합니다! 크레딧을 포함하여 업데이트했습니다. 지금 모든 것이 정상인지 확인하십시오.
Marcio Mazzucato

19

다음은 값이 숫자인지 또는 숫자로 안전하게 변환 될 수 있는지 확인하는 효율적인 함수입니다 .

function isNumber(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    if (typeof value == 'number') {
        return true;
    }
    return !isNaN(value - 0);
}

그리고 정수의 경우 (값이 float이면 false를 반환합니다) :

function isInteger(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    return value % 1 == 0;
}

여기서 효율성은 값이 이미 숫자 인 경우 parseInt (또는 parseNumber)를 피할 수 있다는 것입니다. 두 구문 분석 함수는 항상 문자열로 먼저 변환 한 다음 해당 문자열을 구문 분석하려고 시도합니다. 값이 이미 숫자이면 낭비입니다.

최적화를위한 추가 아이디어를 제공 한 다른 게시물에 감사합니다!


3
이 함수는 빈 문자열에서 실패합니다. isNumber ( '')가 true입니다.
Jason Grout

14
function isInteger(x) { return typeof x === "number" && isFinite(x) && Math.floor(x) === x; }
function isFloat(x) { return !!(x % 1); }

// give it a spin

isInteger(1.0);        // true
isFloat(1.0);          // false
isFloat(1.2);          // true
isInteger(1.2);        // false
isFloat(1);            // false
isInteger(1);          // true    
isFloat(2e+2);         // false
isInteger(2e+2);       // true
isFloat('1');          // false
isInteger('1');        // false
isFloat(NaN);          // false
isInteger(NaN);        // false
isFloat(null);         // false
isInteger(null);       // false
isFloat(undefined);    // false
isInteger(undefined);  // false

4
분명히 .0으로 끝나는 float는 JavaScript에서 자동으로 Int로 캐스트됩니다.

로 실패했습니다 1.2. 항상 0.1 0.2 0.3으로 수치 함수를 테스트
Lukas Liesis

@LukasLiesis는 나를 위해하지 않습니다.
doubleOrt

여기서 엄격한 평등 연산자는 필요하지 않습니다.
doubleOrt

isFloat (1563457121531)에서 false를 반환 함
Aalex Gabi

9
function isInt(n) 
{
    return n != "" && !isNaN(n) && Math.round(n) == n;
}
function isFloat(n){
    return n != "" && !isNaN(n) && Math.round(n) != n;
}

모든 경우에 작동합니다.


2
+1 좋습니다. 예상대로 isInt('1')반환합니다 true(적어도 나를 위해). 이상한 충분하지만,이 반환 trueisInt([5])뿐만 아니라. 나에게 중요하지 않았지만 당신을 위해 노력할 수도 있습니다.
acdcjunior

2
isFloat (12.0) is false
django

6

다른 사람들이 언급했듯이 JS에는 두 배만 있습니다. 그렇다면 숫자를 정수로 어떻게 정의합니까? 반올림 된 숫자가 자신과 같은지 확인하십시오.

function isInteger(f) {
    return typeof(f)==="number" && Math.round(f) == f;
}
function isFloat(f) { return typeof(f)==="number" && !isInteger(f); }

3
값이 숫자 ... 있는지 확인 할 수 있습니다 isFloat('abc')반환true
Dagg Nabbit

isFloat(NaN) // true
shime

@ shime : 잘 잡아. NaN은 기술적으로 부동 소수점 숫자입니다 ... 유스 케이스가 무엇인지 가정합니다.
Claudiu


5

정수에 사용하는 것은 다음과 같습니다.

Math.ceil(parseFloat(val)) === val

짧고 좋은 :) 항상 작동합니다. 내가 틀리지 않으면 David Flanagan이 제안한 것입니다.


나는 암호 비트 연산에 의존하지 않는 짧고 간단한 대답이기 때문에 이것을 좋아합니다.
Jim

parseFloat?
doubleOrt

4

실제로 달성하려는 목표에 달려 있습니다. 강력하게 입력 된 언어를 "에뮬레이션"하려면 시도하지 않는 것이 좋습니다. 다른 사람들이 언급했듯이 모든 숫자는 동일한 표현 (동일한 유형)을 갖습니다.

Claudiu 와 같은 것을 사용하여 제공했습니다 :

isInteger( 1.0 ) -> 참

상식으로는 괜찮아 보이지만 C와 같은 방식으로 얻을 수 있습니다. false


4

소수점 이하 자릿수가 0 인 부동 소수점 숫자 (예 : 1.0, 12.00, 0.0)는 암시 적으로 정수로 캐스트되므로 부동 소수점인지 여부를 확인할 수 없습니다.



3

실제로 그렇게 복잡 할 필요는 없습니다. 정수의 parseFloat () 및 parseInt ()에 해당하는 숫자 값은 동일합니다. 따라서 다음과 같이 할 수 있습니다.

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

그때

if (isInt(x)) // do work

이것은 또한 문자열 검사를 허용하므로 엄격하지 않습니다. 강력한 유형의 솔루션을 원한다면 (일명 문자열로 작동하지 않음) :

function is_int(value){ return !isNaN(parseInt(value * 1) }

isInteger (12.0) is true
django

3
var isInt = function (n) { return n === (n | 0); };

이것이 일을하지 않은 경우가 없었습니다.


죄송합니다. 왜 이것이 거짓을 반환합니까? console.log (isInt (7932938942839482938));
itsme

4
MaxInt를 초과하기 때문입니다.
ankr

그러나 Int max length nope를 설정할 수 있습니까? int 길이가 반환되지 않으면 어떻게됩니까?
itsme

1
@ekussberg 그렇습니다 2. 정수 이므로 23함수의 두 번째 인수로 간주됩니다. 자바 스크립트에서 십진수는 점을 구분자로 사용하여 작성되므로 반드시 입력해야합니다 2.23.
ankr

1
또는 비트 연산에 대해 배울 수있는 좋은 기회입니다. 앞으로는 많은 이점을 얻을 수 있습니다.
ankr

2

이 코드는 INT 및 플로트 확인을위한 최종 코드입니다

function isInt(n) { 
   if(typeof n == 'number' && Math.Round(n) % 1 == 0) {
       return true;
   } else {
       return false;
   }
} 

또는

function isInt(n) {   
   return typeof n == 'number' && Math.Round(n) % 1 == 0;   
}   

이것은 n이 숫자 인 경우에만 float를 테스트합니다
hacklikecrack

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

function isFloat(n) {
   return ((typeof n==='number')&&(n%1!==0));
}

function isNumber(n) {
   return (typeof n==='number');
}

정수는 부동하지 않습니까? 나에게 뉴스.
Maarten Bodewes

2

다음과 같이 간단합니다.

if( n === parseInt(n) ) ...

콘솔에서 이것을 시도하십시오 :

x=1;
x===parseInt(x); // true
x="1";
x===parseInt(x); // false
x=1.1;
x===parseInt(x); // false, obviously

// BUT!

x=1.0;
x===parseInt(x); // true, because 1.0 is NOT a float!

이것은 많은 사람들을 혼란스럽게합니다. 무언가가 .0 일 때마다 더 이상 부동이 아닙니다. 정수입니다. 또는 C에서와 같이 엄격한 구별이 없기 때문에 그냥 "숫자"라고 부를 수 있습니다.

따라서 기본적으로 할 수있는 것은 1.000이 정수라는 사실을 받아들이는 정수를 확인하는 것입니다.

재미있는 사이드 노트

거대한 숫자에 대한 의견이있었습니다. 숫자가 크면이 방법에 아무런 문제가 없습니다. parseInt가 숫자를 처리 할 수 ​​없을 때마다 (너무 큰 경우) 실제 값 이외의 값을 반환하므로 테스트에서 FALSE를 반환합니다. 이것은 "숫자"로 간주 될 경우 일반적으로 JS 가이 를 계산할 수 있기를 기대하기 때문에 좋은 것입니다. 그렇습니다 .

이 시도:

<script>

var a = 99999999999999999999;
var b = 999999999999999999999; // just one more 9 will kill the show!
var aIsInteger = (a===parseInt(a))?"a is ok":"a fails";
var bIsInteger = (b===parseInt(b))?"b is ok":"b fails";
alert(aIsInteger+"; "+bIsInteger);

</script>

내 브라우저 (IE8)에서 이것은 "a is ok; b failed"를 반환합니다. 이것은 정확히 b의 숫자 때문입니다. 한계는 다를 수 있지만 20 자리는 "누구에게 충분해야한다"고 고전을 인용합니다. :)


( 정수 POV에서) 정수만 확인해야하는 경우에는 문제가 없지만 실제로 계산 POV에서 정수처럼 작동 하는지 확인 하려면 숫자가 잘못 될 수 있습니다. 이 의견을 참조하십시오 .
Dagg Nabbit

음 ... 왜 그렇게 생각해? parseInt가 무언가를 반환하고 변수 자체와 같다면 n이 정수로 작동하는지 확인할 수 있습니다. 99999999999999999999 (즉, "9"의 20 배)는 숫자 인 반면 "9"를 더 추가하면 parseInt가 실패합니다 (1을 반환 함). 브라우저에 따라 다를 수 있습니다. 그러나 YES, 한계가 있으며 NO, 그 한계를 벗어나면 위의 검사에서 true를 반환하지 않습니다.
dkellner

내 말은 32 비트 정수로 표현할 수없는 숫자에 대한 비트 연산자 (32 비트 정수로 처리)는 32 비트 정수로 나타낼 수없는 숫자에 대한 예상 결과를 제공하지 않으므로 해당 숫자를 정수로 식별해서는 안됩니다. 이것은 제안 된 Number.isInteger작동 방식 과 일치 합니다.
Dagg Nabbit

하나의 특정 방식으로 저장하지 않고 진정한 정수가 될 수 있습니다. 나는 당신의 요점을 알지만 정수는 소수 부분이 없기 때문에 정수이며 정수와 같은 결과를 얻지 않고 임의로 추가 / 뺄 수 있습니다. 숫자를 비트 필드로 취급하면 실제로 저장되어 있지만 100 % 신뢰할 수없는 방법 인 숫자 저장 방법에 대해 추측하고 있습니다. "특정 방법으로 저장된 정수"를 찾고 있다면 모든 플랫폼에서 안전하게 사용할 수있는 한 줄 테스트가 확실하지 않습니다.
dkellner

32 비트 정수로 표현할 수있는 숫자는 비트 연산자에서 100 % 안정적으로 작동합니다. 당신은 "그들이 어떻게 저장되는지에 관해 어떤 것도 제안하지 않습니다"; 숫자는 사양에 따라 부호있는 32 비트 빅 엔디안 2의 보수 정수로 변환됩니다. 이 형식으로 표현할 수없는 숫자는 정수로 간주되지 않아야합니다. 다시, 이것은 Number.isInteger작동 방식 과 일치 합니다. 단일 라인 테스트는 n === (n | 0)다른 답변에 나와 있습니다.
Dagg Nabbit

2

이 솔루션은 저에게 효과적이었습니다.

<html>
<body>
  <form method="post" action="#">
    <input type="text" id="number_id"/>
    <input type="submit" value="send"/>
  </form>
  <p id="message"></p>
  <script>
    var flt=document.getElementById("number_id").value;
    if(isNaN(flt)==false && Number.isInteger(flt)==false)
    {
     document.getElementById("message").innerHTML="the number_id is a float ";
    }
   else 
   {
     document.getElementById("message").innerHTML="the number_id is a Integer";
   }
  </script>
</body>
</html>

1

정수의 경우 이것을 사용합니다

function integer_or_null(value) {
    if ((undefined === value) || (null === value)) {
        return null;
    }
    if(value % 1 != 0) {
        return null;
    }
    return value;
}

1

자바 스크립트에서 모든 숫자는 internally 64 bit floating pointjava의 double과 동일합니다. 자바 스크립트에는 다른 유형이 없으며 모두 유형으로 표시됩니다 number. 따라서 당신은 instanceof수표를 만들 수 없습니다 . 그러나 위의 솔루션을 사용하여 소수인지 확인할 수 있습니다. Java 스크립트 디자이너는 단일 유형을 사용하여 수많은 유형 캐스트 ​​오류를 ​​피할 수 있습니다.


1

때때로 Number 객체를 사용하면 mod 연산자 (%)를 직접 사용할 수 없습니다.이 경우에는이 솔루션을 사용할 수 있습니다.

if(object instanceof Number ){
   if( ((Number) object).doubleValue() % 1 == 0 ){
      //your object is an integer
   }
   else{
      //your object is a double
   }
}

1

여기에 대한 답변 중 일부를 시도하면이 솔루션을 작성하게되었습니다. 이것은 문자열 안의 숫자와도 작동합니다.

function isInt(number) {
    if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return !(number - parseInt(number));
}

function isFloat(number) {
    if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return number - parseInt(number) ? true : false;
}

    var tests = {
        'integer' : 1,
        'float' : 1.1,
        'integerInString' : '5',
        'floatInString' : '5.5',
        'negativeInt' : -345,
        'negativeFloat' : -34.98,
        'negativeIntString' : '-45',
        'negativeFloatString' : '-23.09',
        'notValidFalse' : false,
        'notValidTrue' : true,
        'notValidString' : '45lorem',
        'notValidStringFloat' : '4.5lorem',
        'notValidNan' : NaN,
        'notValidObj' : {},
        'notValidArr' : [1,2],
    };

    function isInt(number) {
        if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
        return !(number - parseInt(number));
    }
    
    function isFloat(number) {
        if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
        return number - parseInt(number) ? true : false;
    }

    function testFunctions(obj) {
        var keys = Object.keys(obj);
        var values = Object.values(obj);

        values.forEach(function(element, index){
            console.log(`Is ${keys[index]} (${element}) var an integer? ${isInt(element)}`);
            console.log(`Is ${keys[index]} (${element}) var a float? ${isFloat(element)}`);
        });
    }

    testFunctions(tests);


0

이것은 아마도 % 답변만큼 성능이 좋지 않아서 문자열로 먼저 변환하지 않아도되지만 아직 아무도 게시하지는 않았으므로 제대로 작동 해야하는 다른 옵션이 있습니다.

function isInteger(num) {
    return num.toString().indexOf('.') === -1;
}

좋은 접근 IMHO
Sergei Panfilov

ES6 메소드 contains ()를 사용하면이 대답이 훨씬 간단 해집니다.
Axle

0

궁금한 점이 Benchmark.js를 사용 하여이 게시물에서 가장 많이 투표 된 답변 (오늘 게시 된 답변)을 테스트 한 결과는 다음과 같습니다.

var n = -10.4375892034758293405790;
var suite = new Benchmark.Suite;
suite
    // kennebec
    .add('0', function() {
        return n % 1 == 0;
    })
    // kennebec
    .add('1', function() {
        return typeof n === 'number' && n % 1 == 0;
    })
    // kennebec
    .add('2', function() {
        return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
    })

    // Axle
    .add('3', function() {
        return n.toString().indexOf('.') === -1;
    })

    // Dagg Nabbit
    .add('4', function() {
        return n === +n && n === (n|0);
    })

    // warfares
    .add('5', function() {
        return parseInt(n) === n;
    })

    // Marcio Simao
    .add('6', function() {
        return /^-?[0-9]+$/.test(n.toString());
    })

    // Tal Liron
    .add('7', function() {
        if ((undefined === n) || (null === n)) {
            return false;
        }
        if (typeof n == 'number') {
            return true;
        }
        return !isNaN(n - 0);
    });

// Define logs and Run
suite.on('cycle', function(event) {
    console.log(String(event.target));
}).on('complete', function() {
    console.log('Fastest is ' + this.filter('fastest').pluck('name'));
}).run({ 'async': true });

0 x 12,832,357 ops/sec ±0.65% (90 runs sampled)
1 x 12,916,439 ops/sec ±0.62% (95 runs sampled)
2 x 2,776,583 ops/sec ±0.93% (92 runs sampled)
3 x 10,345,379 ops/sec ±0.49% (97 runs sampled)
4 x 53,766,106 ops/sec ±0.66% (93 runs sampled)
5 x 26,514,109 ops/sec ±2.72% (93 runs sampled)
6 x 10,146,270 ops/sec ±2.54% (90 runs sampled)
7 x 60,353,419 ops/sec ±0.35% (97 runs sampled)

Fastest is 7 Tal Liron

0

여기 내 코드가 있습니다. 빈 문자열이 아닌지 확인하고 (그렇지 않으면 전달됨) 숫자 형식으로 변환합니다. 이제 '1.1'을 1.1로 원하는지 여부에 따라 원하는 것이거나 아닐 수도 있습니다.

var isFloat = function(n) {
    n = n.length > 0 ? Number(n) : false;
    return (n === parseFloat(n));
};
var isInteger = function(n) {
    n = n.length > 0 ? Number(n) : false;
    return (n === parseInt(n));
};

var isNumeric = function(n){

   if(isInteger(n) || isFloat(n)){
        return true;
   }
   return false;

};

0

양의 정수와 음의 정수 모두에 대해 true를 반환하는이 작은 함수를 좋아합니다.

function isInt(val) {
    return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN(val+".0");
}

이것은 1 또는 "1"이 "1.0"이되고, isNaN ()은 false를 반환하지만 (부정하고 리턴) 1.0 또는 "1.0"은 "1.0.0"이되고 "string"은 "string"이되기 때문에 작동합니다. 0 "은 숫자가 아니므로 isNaN ()은 false를 반환합니다 (다시 부정됩니다).

양의 정수만 원하면 다음과 같은 변형이 있습니다.

function isPositiveInt(val) {
    return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN("0"+val);
}

또는 음의 정수인 경우 :

function isNegativeInt(val) {
    return `["string","number"].indexOf(typeof(val)) > -1` && val !== '' && isNaN("0"+val);
}

isPositiveInt ()는 연결된 숫자 문자열을 테스트 할 값보다 먼저 이동하여 작동합니다. 예를 들어, isPositiveInt (1)은 "01"을 평가하는 isNaN ()의 결과로 거짓을 평가합니다. 한편, isPositiveInt (-1)은 "0-1"을 평가하는 isNaN ()이되며, 이는 참으로 평가됩니다. 우리는 반환 값을 부정하고 우리가 원하는 것을 제공합니다. isNegativeInt ()는 비슷하게 작동하지만 isNaN ()의 반환 값을 무시하지 않습니다.

편집하다:

내 원래 구현은 배열과 빈 문자열에서도 true를 반환합니다. 이 구현에는 그러한 결함이 없습니다. 또한 val이 문자열이나 숫자가 아니거나 빈 문자열이면 일찍 반환하는 이점이 있습니다.이 경우 더 빠릅니다. 처음 두 절을 다음과 같이 바꿔서 더 수정할 수 있습니다.

typeof(val) != "number"

문자열이 아닌 리터럴 숫자 만 일치시키려는 경우

편집하다:

댓글을 아직 게시 할 수 없으므로 내 답변에 추가하고 있습니다. @Asok이 게시 한 벤치 마크는 매우 유익합니다. 그러나 가장 빠른 함수는 부동 소수점, 배열, 부울 및 빈 문자열에 대한 TRUE도 반환하므로 요구 사항에 맞지 않습니다.

다음 테스트 스위트를 만들어 각 함수를 테스트하고 목록에 답변을 추가했습니다 (문자열을 구문 분석하는 함수 8, 그렇지 않은 함수 9).

funcs = [
    function(n) {
        return n % 1 == 0;
    },
    function(n) {
        return typeof n === 'number' && n % 1 == 0;
    },
    function(n) {
        return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
    },
    function(n) {
        return n.toString().indexOf('.') === -1;
    },
    function(n) {
        return n === +n && n === (n|0);
    },
    function(n) {
        return parseInt(n) === n;
    },
    function(n) {
        return /^-?[0-9]+$/.test(n.toString());
    },
    function(n) {
        if ((undefined === n) || (null === n)) {
            return false;
        }
        if (typeof n == 'number') {
            return true;
        }
        return !isNaN(n - 0);
    },
    function(n) {
        return ["string","number"].indexOf(typeof(n)) > -1 && n !== '' && !isNaN(n+".0");
    }
];
vals = [
    [1,true],
    [-1,true],
    [1.1,false],
    [-1.1,false],
    [[],false],
    [{},false],
    [true,false],
    [false,false],
    [null,false],
    ["",false],
    ["a",false],
    ["1",null],
    ["-1",null],
    ["1.1",null],
    ["-1.1",null]
];

for (var i in funcs) {
    var pass = true;
    console.log("Testing function "+i);
    for (var ii in vals) {
        var n = vals[ii][0];
        var ns;
        if (n === null) {
            ns = n+"";
        } else {
            switch (typeof(n)) {
                case "string":
                    ns = "'" + n + "'";
                    break;
                case "object":
                    ns = Object.prototype.toString.call(n);
                    break;
                default:
                    ns = n;
            }
            ns = "("+typeof(n)+") "+ns;
        }

        var x = vals[ii][1];
        var xs;
        if (x === null) {
            xs = "(ANY)";
        } else {
            switch (typeof(x)) {
                case "string":
                    xs = "'" + n + "'";
                    break;
                case "object":
                    xs = Object.prototype.toString.call(x);
                    break;
                default:
                    xs = x;
            }
            xs = "("+typeof(x)+") "+xs;
        }

        var rms;
        try {
            var r = funcs[i](n);
            var rs;
            if (r === null) {
                rs = r+"";
            } else {
                switch (typeof(r)) {
                    case "string":
                        rs = "'" + r + "'";
                        break;
                    case "object":
                        rs = Object.prototype.toString.call(r);
                        break;
                    default:
                        rs = r;
                }
                rs = "("+typeof(r)+") "+rs;
            }

            var m;
            var ms;
            if (x === null) {
                m = true;
                ms = "N/A";
            } else if (typeof(x) == 'object') {
                m = (xs === rs);
                ms = m;
            } else {
                m = (x === r);
                ms = m;
            }
            if (!m) {
                pass = false;
            }
            rms = "Result: "+rs+", Match: "+ms;
        } catch (e) {
            rms = "Test skipped; function threw exception!"
        }

        console.log("    Value: "+ns+", Expect: "+xs+", "+rms);
    }
    console.log(pass ? "PASS!" : "FAIL!");
}

또한 기능 # 8이 목록에 추가 된 벤치 마크를 다시 실행했습니다. 나는 약간 당혹 스럽기 때문에 결과를 게시하지 않을 것입니다 (예 : 그 기능이 빠르지 않습니다) ...

결과는 상당히 길기 때문에 요약 된 테스트를 성공적으로 제거했습니다.

Testing function 0
Value: (object) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) false, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: null, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
FAIL!

Testing function 1
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 2
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 3
Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (object) false, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: null, Expect: (boolean) false, Test skipped; function threw exception!
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) 'a', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
FAIL!

Testing function 4
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 5
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 6
Value: null, Expect: (boolean) false, Test skipped; function threw exception!
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 7
Value: (number) 1.1, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (number) -1.1, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) true, Match: N/A
FAIL!

Testing function 8
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 9
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

나는 실패에 빠졌으므로 각 함수가 실패하는 곳과 (문자열) '#'테스트를 통해 각 함수가 문자열의 정수 및 부동 소수점 값을 처리하는 방법을 볼 수 있습니다. 아닐 수도 있습니다.

테스트 된 10 가지 기능 중 실제로 OP의 요구 사항에 맞는 기능은 [1,3,5,6,8,9]입니다.


0

플로팅 유효성 검사 조건 :

if (lnk.value == +lnk.value && lnk.value != (lnk.value | 0)) 

정수 유효성 검사 조건 :

if (lnk.value == +lnk.value && lnk.value == (lnk.value | 0)) 

이것이 도움이 되길 바랍니다.


0
function int(a) {
  return a - a === 0 && a.toString(32).indexOf('.') === -1
}

function float(a) {
  return a - a === 0 && a.toString(32).indexOf('.') !== -1
}

typeof a === 'number'문자열을 제외하려는 경우 추가 할 수 있습니다 .

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