앞에 0이있는 Javascript parseInt ()


120

Javascript의 parseInt 함수가 완전히 작동하지 않는 것 같습니다.

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

당신은 그것을 설명 할 수 없습니다. 시도 해봐. (jsFiddle)

편집 이 질문에 대한 답변을 받았기 때문에 8 진수로 기본 설정되는 "기능"은 더 이상 사용되지 않습니다. [ 1 ] [ 2 ]


29
당신은 농담해야합니다
게오르그


3
오래 전부터 0으로 시작하는 숫자는 OCTAL을 나타내고 0x는 Hexa-Decimal을 나타냅니다. 나는 이것이 모든 언어에 보편적이라고 믿지만, 다시 나는 틀릴 수 있습니다.
Selvakumar Arumugam

3
참고 : jsFiddlew3schools.com/jsref/tryit.asp 보다 더 나은 온라인 JavaScript 테스터 입니다.
Rocket Hazmat 2012 년

2
@JohnHartsock Yeh, 우리 둘
다이

답변:


181

숫자가 '0'으로 시작하면 8 진수 (8 진수)로 처리되기 때문입니다.

베이스를 두 번째 매개 변수로 전달하여베이스를 강제 할 수 있습니다.

parseInt("09", 10) // 9

문서 에 따르면 두 번째 매개 변수는 선택 사항이지만 예제에서 볼 수 있듯이 항상 10이라고 가정 하지는 않습니다 .


1
이 진수 가정 않다면 그래,하지만, 그것은 09 0 대신 11 개를 반환해야한다
Peeyush Kushwaha

2
@PeeyushKushwaha : 다른 방법으로. 118 9진법은 10 진법입니다. 09은 유효한 8 진법 숫자가 아닙니다.
Rocket Hazmat

그러나 나는에서는 parseInt 후, 어떤 식 으로든 주변이 09합니다
Pardeep 자이나교

39

에 대한 호출 parseInt은 항상 두 번째 인수에 기본을 지정해야합니다.

parseInt("08", 10);

이전 버전의 JavaScript는로 시작하는 문자열 0을 8 진수로 처리하고 (밑 수가 지정되지 않은 경우) 유효한 8 진수 도 08아닙니다 09.

Mozilla 문서에서 :

radix가 정의되지 않거나 0이면 JavaScript는 다음을 가정합니다.

  • 입력 문자열이 "0x"또는 "0X"로 시작하는 경우 기수는 16 (16 진수)입니다.
  • 입력 문자열이 "0"으로 시작하는 경우 기수는 8 (8 진수)입니다. 이 기능은 비표준이며 일부 구현에서는 일부 구현에서이를 지원하지 않습니다 (대신 기수 10 사용). 이러한 이유로 parseInt를 사용할 때 항상 기수를 지정하십시오 .
  • 입력 문자열이 다른 값으로 시작하는 경우 기수는 10 (10 진수)입니다.

첫 번째 문자를 숫자로 변환 할 수없는 경우 parseInt는 NaN을 반환합니다.

그리고 ECMAScript 3 표준에서 :

radix가 0이거나 정의되지 않고 문자열의 숫자가 x 또는 X가 뒤 따르지 않는 0 숫자로 시작 되면 구현은 재량에 따라 숫자를 8 진수 또는 10 진수로 해석 할 수 있습니다. 구현시이 경우 숫자를 십진수로 해석하는 것이 좋습니다.

최신 버전의 JavaScript ( ECMAScript 5 ) 는이 동작을 포기 하지만 이전 브라우저를 만족 시키 려면 기수지정 해야 합니다.


이것은 더 이상 사용되지 않기 때문에 앞으로는 선행 0을 사용하는 것이 좋습니다.
Pacerier

15

기수 매개 변수가 있습니다.

parseInt(value, base)

base는 기수입니다.

이 경우 base10 (십진수) 숫자를 평가하고 있으므로

parseInt(value, 10);

4

이것은 새 브라우저에서 완전히 유효하지 않은 것 같습니다. Internet Explorer 9 및 10은 'parseInt ( "08")'를 실행하면 8을 반환하는 반면 Internet Explorer 8 및 이전 버전은 0을 반환합니다 (쿼크 모드의 IE10도 0을 반환합니다).

최신 버전의 Chrome도 8을 반환하므로 최근에 해석을 변경 한 것 같습니다.


네, 행동이 바뀌 었습니다. 내 대답을 업데이트하겠습니다. developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Wayne

1
예, Firefox 및 Chrome 최신 버전은 현재 문제가 없습니다.
mythicalcoder

3

이 문제는 이제 더 이상 사용되지 않습니다. 그러나 기수를 사용 parseInt하여 다른 기수를 10 진법 으로 변환 할 수 있습니다. 예 :

var baseTwoNumber = parseInt('0010001', 2);

17(의 10 진수)를 반환합니다 0010001.


0

팁 : 이제 8 진수 기본값이 사용되지 않는시기를 알 수 있습니다. 레거시 브라우저에서 수정하는 방법은 다음과 같습니다.

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}

추신 : 문자열 대신에 선행 0이있는 상수 만 사용하면 모든 현재 브라우저에서 기본 8로 처리됩니다.
Agamemnus 2015 년

0

이제 대부분의 브라우저에서 문제가 변경된 것 같습니다.

Firefox 51.0.1 (64 비트)

parseInt("09")   // 9

Chrome 55.0.2883.95 (64 비트)

parseInt("09")   // 9

Safari 10.0 (12602.1.50.0.10)

parseInt("09")   // 9

=====

권장 연습

더 안전하고 문제를 피하기 위해 수락 된 답변 에서 제안한대로 base / radix 매개 변수를 사용하십시오 .

parseInt("09", 10)    // 9

추가 테스트

인수가 문자열이 아닌 경우 이것도 테스트하고 싶었습니다. Chrome 및 Safari는 정확한 결과를 제공합니다. Firefox도 적절한 결과를 반환하지만 경고가 표시됩니다.

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)

값이 0으로 시작하고 숫자이면 parseInt는 여전히 8 진법을 사용합니다. parseInt (020) 시도
sirrocco

예. 나는 제안 된 답변을 지적했습니다. 그리고 피해야 할 모범 사례와 나쁜 기능을 알고 있습니다. 그래서 나는 내 대답에 권장 연습 을 제공했습니다.
mythicalcoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.