Programming

앞에 0이있는 Javascript parseInt ()

procodes 2020. 7. 21. 21:46
반응형

앞에 0이있는 Javascript parseInt ()


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 ]


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

베이스를 2 번째 파라미터로 전달하여베이스를 강제 할 수 있습니다.

parseInt("09", 10) // 9

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


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

parseInt("08", 10);

이전 버전의 JavaScript는 문자열 0을 8 진수로 시작 (기본이 지정되지 않은 경우)으로 취급하며 유효한 8 진수 08아닙니다 09.

Mozilla 문서에서 :

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

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

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

그리고에서 ECMAScript를 3 표준 :

기수가 0 또는 정의되지 않고 문자열의 숫자가 x 또는 X 뒤에 0이 아닌 숫자로 시작 하는 경우, 구현은 임의로 그 숫자를 8 진수 또는 10 진수로 해석 할 수 있습니다. 이 경우 숫자를 10 진수로 해석하는 것이 좋습니다.

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


기수 매개 변수가 있습니다

parseInt(value, base)

기수가 기수입니다.

이 경우 base10 (10 진) 숫자를 평가하므로

parseInt(value, 10);

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

최신 버전의 Chrome도 8을 반환하므로 최근 해석을 변경해야합니다.


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

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

를 반환합니다 17(의 기준 10 0010001).


팁 : 이제 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));
}

대부분의 브라우저에서 문제가 변경된 것으로 보입니다.

Firefox 51.0.1 (64 비트)

parseInt("09")   // 9

Chrome 55.0.2883.95 (64 비트)

parseInt("09")   // 9

사파리 10.0 (12602.1.50.0.10)

parseInt("09")   // 9

=====

권장 연습

Having said that, just to be on the safer side and to avoid issues, use the base/radix parameter as suggested in the accepted answer.

parseInt("09", 10)    // 9

Extra test

I just wanted to test this as well, if the argument is not a string. Chrome & Safari gives exact result. Firefox too returns proper result, but with a warning.

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

참고URL : https://stackoverflow.com/questions/8763396/javascript-parseint-with-leading-zeros

반응형