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


717

어떻게 숫자입니다 찾기하는 float나 integer?

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 : isInteger 및 isSafeInteger를 참조하십시오 .
— 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(적어도 나를 위해). 이상한 충분하지만,이 반환 true을 isInt([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.