빈 문자열에 대해 NaN을 parseInt에서 0으로 바꾸는 방법은 무엇입니까?


298

NaNJavaScript에서 값을 구문 분석 할 때 대신 어떻게 든 0을 반환 할 수 있습니까?

빈 문자열의 parseInt경우을 반환합니다 NaN.

JavaScript로 확인하여 확인할 수 NaN있습니까?

var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)

아니면 비슷한 기능을 수행하는 다른 함수 또는 jQuery 플러그인이 있습니까?


72
참고로 NaN != NaN. 당신이 필요합니다 isNaN(value).
pimvdb

28
그렇습니다. 두 명의 Nannie가 동일하지 않습니다.)
James P.

3
parseInt()성공 / 정상이 아닌 NaN경우 함수를 두 번 호출 하는 것은 좋은 생각이 아닙니다. 비 효율성 외에도, 전달 된 tbb것이 부작용이있는 함수 호출 인지 여부에 대한 경고 는 끔찍합니다. 나는 parseInt()두 번 볼 수있는 해결책을 사용하지 않을 것 입니다.
JonBrave

답변:


756
var s = '';

var num = parseInt(s) || 0;

부울 값과 함께 사용하지 않으면 논리 OR ( ||) 연산자는 첫 번째 표현식 ( parseInt(s))을 true로 평가할 수 있으면 리턴하고 그렇지 않으면 두 번째 표현식 (0)을 리턴합니다. 의 반환 값 parseInt('')은 NaN입니다. NaN은 false로 평가되므로 num0으로 설정됩니다.


6
s = "4s"인 경우 작동하지 않습니다. (4를 반환합니다 ... 정확하지 않습니다 ...)
markzzz

1
js의 parseInt 함수 문자열의 숫자를 구문 분석
ali youhannaei

26
@markzzz 다시 질문을 읽으십시오. OP가 묻습니다. " 어떻게 NaN 대신 0을 반환 할 수 있습니까? " OP는 특정 문자열을 int로 구문 분석 할 수 있는지 여부를 확인하고 싶지 않습니다. OP가 0대신 받기 를 원합니다 NaN. 이것은 Matt의 코드로 완벽하게 해결됩니다.
trejder

2
@markzzzvar nextIphone = parseInt("4S") + 1; // wow it works!
제로 산만

2
@Matthew는 "거짓" 또는 "거짓" 이라는 용어를 사용하십시오 . NaN === false가 거짓이기 때문에! 그러나 Boolean (NaN) === Boolean (false)는 true입니다. 논리적 인 OR이 "truthy"
Pablo Recalde

51

isNaN()기능을 사용할 수도 있습니다 :

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)

12
parseInt(s)두 번 전화 합니까? 또한parseInt(s, 10)
Dexygen

2
@GeorgeJempty 기수 "10"이 기본값입니다. 해당 매개 변수는 선택 사항입니다. parseInt()그래도 두 번 전화하는 것이 좋습니다.
Autumn Leonard

8
@AutumnLeonard 이것은 사실입니다. 문자열이 0으로 시작하면 숫자가 8 진수 형식 인 것으로 가정하므로 parseInt ( '077')은 63을 제공합니다. 이로 인해 버그를 찾기가 매우 어려워 질 수 있으므로 항상 두 번째 매개 변수를 지정해야합니다. 예를 들어 stackoverflow.com/questions/8763396/…
chuck258

22

나는 누군가가을 사용하는 것을 언급하지 않은 것에 놀랐다 Number(). 제공된 경우 10 진수를 구문 분석하므로, 다르게 작동 parseInt()하지만 이미 10을 가정하고 ""또는 ""를 0으로 바꿉니다.


1
예, localStorage에서 읽는 데 매우 편리합니다. Number (localStorage.getItem ( 'appBanner.count')) + 1
Philip Murphy

이 요청되었을 때 질문에 대한 그 작품이지만, 여전히 비 숫자 공백이 아닌 문자에 대한 NaN이를 반환
카일 딜레이 니

9

로 제한되지 않은 사람들의 parseInt경우 비트 OR 연산자 (암시 적 ToInt32으로 피연산자를 호출) 를 사용할 수 있습니다 .

var value = s | 0;

// NaN | 0     ==>> 0
// ''  | 0     ==>> 0
// '5' | 0     ==>> 5
// '33Ab' | 0  ==>> 0
// '0x23' | 0  ==>> 35
// 113 | 0     ==>> 113
// -12 | 0     ==>> -12
// 3.9 | 0     ==>> 3

참고 : ToInt32와 다릅니다 parseInt. (즉 parseInt('33Ab') === 33)


그러나 : '10000000000' | 0 === 1410065408.
trincot

@trincot 예, 모든 값> = Math.pow(2, 31)이 오버플로됩니다.
Ahmad Ibrahim

8

문제

다른 답변 0은 허위 인 것을 고려하지 않으므로 0 대신 20이됩니다.

const myNumber = parseInt('0') || 20; // 20

해결책

나는 대부분의 문제를 해결하는 도우미 기능을 제안합니다.

function getNumber({ value, defaultValue }) {
  const num = parseInt(value, 10);
  return isNaN(num) ? defaultValue : num;
}

도우미 기능은 다음과 같은 결과를 제공합니다.

getNumber({ value: "0", defaultValue: 20 }); // 0
getNumber({ value: "2", defaultValue: 20 }); // 2
getNumber({ value: "2.2", defaultValue: 20 }); // 2
getNumber({ value: "any string", defaultValue: 20 }); // 20
getNumber({ value: undefined, defaultValue: 20 }); // 20
getNumber({ value: null, defaultValue: 20 }); // 20
getNumber({ value: NaN, defaultValue: 20 }); // 20
getNumber({ value: false, defaultValue: 20 }); // 20
getNumber({ value: true, defaultValue: 20 }); // 20

2
parseInt :으로 기수를 보내십시오. parseInt(string, radix)이것을 고려하십시오 : parseInt("0x10") === 16또한 일부 브라우저에서 parseInt("010")생성 될 수 있습니다8
andlrc

2
이미 다른 것들에 대해 lodash에 의존하고 있다면, defaultTo단지 이것을 수행 하는 편리한 함수가 있습니다 : _.defaultTo(NaN, -1)returns -1, 그러나 _.defaultTo(0, -1);returns 0.
waldyrious

이것은 훌륭한 포인트입니다! ||에만 의존 할 수 있습니다 원하는 기본값이 ZERO 인 경우 올바른 기본값을 제공하기 위해 마지막에 부여됩니다 (권한 부여됨, OP가 원하는 것임). 언급 한 바와 같이, '0'입력의 잘못된 속성으로 인해이 경우 유효하지 않은 입력으로 취급되며, 명령문은 기본값을 대신 반환합니다 (예상하지 않을 수도 있습니다!)
JonathanDavidArndt

확실히 당신은 전화 대신 const를 사용해야 parseInt
카일 딜레이 니

4

내 의견으로는 파싱보다 훨씬 깨끗한 작업을 수행합니까?

var s = '';
console.log(+s);

var s = '1024'
+s
1024

s = 0
+s
0

s = -1
+s
-1

s = 2.456
+s
2.456

s = ''
+s
0

s = 'wtf'
+s
NaN

1
매우 컴팩트합니다. 더 많은 점수를 얻지 못한 것이 얼마나 부끄러운 일입니까. 나는 당신을 투표했다. 오늘 음소거 트롤이 ​​획득 한 -2를 잡으려고 보답하십시오 ... (이 페이지의 끝에서 내 답변을보십시오). 감사합니다.
Fabien Haddadi


1

빈 문자열 (별도의 경우)을 별도로 확인하고이 경우 0으로 설정하십시오.

시작 부분에 "0"을 적용 할 수 있지만 10 진수가 아니라 10 진수임을 나타내는 접두사를 추가해야합니다.


비어 있으면 0을 추가하는 것이 더 낫다고 생각합니까?
Joper

1
아니요-내가 사용한 접근법입니다. 이 경우 별도의 검사가 더 좋습니다. 그러나 매트 솔루션이 작동하면 더 깨끗합니다.
Schroedingers 고양이

1

왜 함수를 무시하지 않습니까? 이 경우 당신은 항상 반환 확신 할 수 0의 경우 NaN:

(function(original) {
    parseInt = function() {
        return original.apply(window, arguments) || 0;
    };
})(parseInt);

이제 코드의 어느 곳에서나 :

parseInt('') === 0

15
이와 같은 함수를 재정의하면 버그로 볼 수있는 전문 JavaScript 프로그래머를 혼동 할 수 있습니다. 무시 된 기능은 보이지 않는 곳에 묻힐 수 있습니다. 이것은 독창적이지만 || 0Matt의 답변 에서처럼 as를 추가하는 것이 얼마나 쉬운지를 고려하여 개인적으로 권장할지는 확실하지 않습니다 . 최후의 수단으로 소유하지 않은 객체를 재정의하거나 시간과 복잡성 측면에서 비용이 훨씬 많이 듭니다.
jmort253

2
@ jmort253에 동의합니다 ... 기능이 너무 똑똑해서 위험합니다. getSafeNumberValue와 같은 이름이나 이와 유사한 이름으로 정확히 동일한 기능을 수행하는 것이 좋습니다.
사무엘

1

비슷한 문자열 (firefox v34)과 비슷한 문제가 발생했습니다.

var myInt = parseInt("b4");

그래서 나는 빠른 해킹을 생각해 냈습니다.

var intVal = ("" + val).replace(/[^0-9]/gi, "");

그리고 단순하지 않은 것들에 대한 floats + int를 다루기 위해 모든 바보가 복잡해졌습니다.

var myval = "12.34";

function slowParseNumber(val, asInt){
    var ret = Number( ("" + val).replace(/[^0-9\.]/gi, "") );
    return asInt ? Math.floor(ret) : ret;
}
var floatVal = slowParseNumber(myval);

var intVal = slowParseNumber(myval, true);
console.log(floatVal, intVal);

다음과 같은 경우 0을 반환합니다.

var intVal = slowParseNumber("b"); // yeilds 0

1
//////////////////////////////////////////////////////
function ToInt(x){x=parseInt(x);return isNaN(x)?0:x;}
//////////////////////////////////////////////////////
var x = ToInt('');   //->  x=0
    x = ToInt('abc') //->  x=0
    x = ToInt('0.1') //->  x=0
    x = ToInt('5.9') //->  x=5
    x = ToInt(5.9)   //->  x=5
    x = ToInt(5)     //->  x=5

이 솔루션을 설명 할 수 있습니까?
RamenChef

u가 '123'또는 123과 같은 숫자를 정수로 변환하려면 parseInt ( 'abc')를 사용하는 경우
AbdulRahman AlShamiri

만약 당신이 parseInt ( 'abc')를 사용한다면 u는 NaN에 도달하지만이 함수는 NaN을 0으로 변환 할 것입니다
AbdulRahman AlShamiri

빙고, ||접근 방식 의 명시 적 대안 . 나는 이것이 오래된 질문과 답변이라는 것을 알고 있지만,이 답변은 parseInt를 두 번 호출하지 않으며 isNaN을 올바르게 사용합니다. 기수 parseInt(x, 10)가 철저 해야합니다 . (내 선호는 재사용 대신 별도의 내부 변수입니다 x.)
goodeye

1

나는 이것을 처리하기 위해 2 개의 프로토 타입을 만들었고, 하나는 숫자, 하나는 문자열입니다.

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

// returns the int value or -1 by default if it fails
Number.method('tryParseInt', function (defaultValue) {
    return parseInt(this) == this ? parseInt(this) : (defaultValue === undefined ? -1 : defaultValue);
});

// returns the int value or -1 by default if it fails
String.method('tryParseInt', function (defaultValue) {
    return parseInt(this) == this ? parseInt(this) : (defaultValue === undefined ? -1 : defaultValue);
});

안전 점검을 사용하지 않으려면

String.prototype.tryParseInt = function(){
    /*Method body here*/
};
Number.prototype.tryParseInt = function(){
     /*Method body here*/
};

사용법 예 :

var test = 1;
console.log(test.tryParseInt()); // returns 1

var test2 = '1';
console.log(test2.tryParseInt()); // returns 1

var test3 = '1a';
console.log(test3.tryParseInt()); // returns -1 as that is the default

var test4 = '1a';
console.log(test4.tryParseInt(0));// returns 0, the specified default value

1
// implicit cast
var value = parseInt(tbb*1); // see original question

사소한 것을 찾지 못한 사람들을위한 설명 :

"암시 적 캐스트"라는 방법에 1을 곱하면 알 수없는 유형 피연산자를 기본 유형 '숫자'로 바꾸려고 시도합니다. 특히 빈 문자열은 숫자 0이되어 parseInt ()에 적합한 유형이됩니다.

PirateApp은 위와 같이 아주 좋은 예를 제시했습니다. PirateApp은 + 부호를 붙여서 JavaScript가 Number 암시 적 캐스트를 사용하도록 강요했습니다.


내 사랑하는 원래 질문에 대한 직접적인 답변입니다.
Fabien Haddadi

이것은을 위해 할 수 없습니다parseInt('str'*1)
로디온 Baskakov

parseInt이미 숫자 인 것을 불러야 합니까? 다시 문자열로 다시 변환하면 숫자로 다시 변환됩니다.
trincot

0

또한이 방법으로 함수를 작성하고 필요한 곳에서 호출하십시오. 계산을 수행하기 위해 양식 필드에 들어가는 것으로 가정합니다.

var Nanprocessor = function (entry) {
    if(entry=="NaN") {
        return 0;
    } else {
        return entry;
    }
}

 outputfield.value = Nanprocessor(x); 

// where x is a value that is collected from a from field
// i.e say x =parseInt(formfield1.value); 

이게 뭐가 문제 야?


안녕, 와트가 우리를 위의 방법을 따르지 못하게 막고있어. n 배우고 싶습니다.
Naresh

3
테스트 하려면 isNaN 을 사용해야 합니다 NaN.
Matthew

2
감사합니다 매트 :) javascrip에 isNaN ()이라는 함수가 있다는 것을 모르겠습니다! 알려 줘서 고마워...!
Naresh

0

여기에 내가 사용하고있는 tryParseInt 메소드가 있습니다. 이것은 기본값을 두 번째 매개 변수로 사용하므로 필요한 모든 것이 될 수 있습니다.

function tryParseInt(str, defaultValue) {
    return parseInt(str) == str ? parseInt(str) : defaultValue;
}

tryParseInt("", 0);//0 
tryParseInt("string", 0);//0 
tryParseInt("558", 0);//558

0

여전히 기수를 사용할 수있는 도우미 기능

function parseIntWithFallback(s, fallback, radix) {
    var parsed = parseInt(s, radix);
    return isNaN(parsed) ? fallback : parsed;
}

0

매우 깨끗한 코드를 가질 수 있습니다. 비슷한 문제가 있었고 다음을 사용하여 해결했습니다.

var a="bcd";
~~parseInt(a);

0

이 솔루션을 찾는 다른 사람들을 위해 다음을 사용하십시오. ~~ parseInt없이 가장 깨끗한 모드입니다.

var a = 'hello';
var b = ~~a;

NaN이면 대신 0을 반환합니다.

OBS. 이 솔루션은 정수에만 적용됩니다

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