문제

JavaScript에서 다음을 실행해보십시오.

parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!

방금 JavaScript가 주요 제로가 옥탈 정수, 그리고 없기 때문에 "8" 또는 "9" Base-8에서 함수는 0을 반환합니다. 좋아하거나 말거나, 이것은 디자인에 의한 것입니다.

해결 방법은 무엇입니까?

참고 : 완전성을 위해 솔루션을 게시하려고하지만 내가 싫어하는 솔루션이므로 다른/더 나은 답변을 게시하십시오.


업데이트:

JavaScript 표준의 5 판 (ECMA-262)은 이러한 동작을 제거하는 깨진 변화를 소개합니다. 모질라는 좋은 사람이 있습니다 쓰기.

도움이 되었습니까?

해결책

이것은 간단한 솔루션이있는 일반적인 JavaScript Gotcha입니다.

단지 베이스를 지정합니다, 또는 'radix', 그렇게 :

parseInt('08',10); // 8

당신은 또한 사용할 수 있습니다 숫자:

Number('08'); // 8

다른 팁

만약 너라면 알다 귀하의 가치는 서명 된 32 비트 정수 범위에있을 것입니다. ~~x 모든 시나리오에서 올바른 일을 할 것입니다.

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

이진을 찾는 경우~), 사양에는 int32로의 명백한 변환을 수행하고 강제로 지정되는 인수에 대한 "Toint32"변환이 필요합니다. NaN 0으로 값.

예, 이것은 엄청나게 해킹되지만 너무 편리합니다 ...

로부터 parseint 문서, 옵션 Radix 인수를 사용하여 Base-10을 지정하십시오.

parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9

이것은 나를 괴롭 히고 혼란스럽고, 장악 (실제로 모든 단일 파르 세인트에서 추가 논쟁?)으로 부딪칩니다. 그래서 나는 더 나은 방법이 있기를 바라고 있습니다.

function parseDecimal(s) { return parseInt(s, 10); }

편집 : 자신만의 기능을 만들고 실제로 원하는 것을 수행하는 것은 Parseint () 호출에 항상 ", 10"을 추가하는 것을 좋아하지 않는다면 옵션입니다. 그것은 비표준 기능이라는 단점이 있습니다. 많이 사용하면 더 편리하지만 다른 사람들에게는 더 혼란 스러울 것입니다.

베이스 지정 :

var number = parseInt(s, 10);

두 번째 매개 변수가없는 경우 소수점을 가정하는 버전으로 Parseint를 대체하는 것이 매우 장난 스럽습니까? (참고 - 테스트되지 않음)

parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}

소수점은 어떻습니까 :

('09'-0) === 9  // true

('009'-0) === 9 // true

또한 Parsefloat 또는 Parseint를 사용하는 대신 단시 연산자를 사용할 수도 있습니다 (+).

+"01"
// => 1

+"02"
// => 2

+"03"
// => 3

+"04"
// => 4

+"05"
// => 5

+"06"
// => 6

+"07"
// => 7

+"08"
// => 8

+"09"
// => 9

그리고 좋은 측정을 위해

+"09.09"
// => 9.09

MDN 링크

Unary Plus 운영자는 피연산자 앞에서 피연산자를 평가하고 피연산자로 평가하지만 아직 그렇지 않은 경우 숫자로 변환하려고 시도합니다. 단일 부정 (-)도 비 인수를 변환 할 수 있지만 Unary Plus는 무언가를 숫자로 변환하는 가장 빠르고 선호하는 방법입니다., 숫자에 대한 다른 작업을 수행하지 않기 때문에.

Parseint와 이미 많은 코딩을했는데 "10", "10"을 추가하고 싶지 않은 경우, 기본 10을 기본값으로 만들기 위해 기능을 무시할 수 있습니다.

window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
    if (! rad) {
        return _oldParseInt(str, 10);
    }
    return _oldParseInt(str, rad);
};

이는 나중에 독자를 혼동 할 수 있으므로 parseint10 () 함수를 만드는 것이 더 자명 할 수 있습니다. 개인적으로 나는 ", 10"을 항상 추가하는 것보다 간단한 기능을 사용하는 것을 선호합니다. 단지 실수를위한 더 많은 기회를 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top