티스토리 뷰

전자결재 날자계산을 하던중
08시 혹은 09시를 입력하면 간혹 0시로 들어가는 현상 발생함.

function test(val){
    if(parseInt(val) < 10){
        val = '0' + parseInt(val);
    }
    return val;
}



alert(parseInt('08') + ':' + parseInt('09'));

IE5 = 0:0
IE7 = 0:0
IE8 = 0:0
IE9이상 = 8:9
크롬외 = 8:9;

IE8버전 이하에서 발생함.



모든 PC에서 발생하는 것이 아닌 특정 PC에서 발생
확인해 보니 IE브라우저에서 호환성을 켜놓으면 IE5쿼크로 열렸을 경우
발생하는 문제.

여태까지 버그 인줄로만 알았던 것이.. 사실은 버그가 아니었다는...
레퍼런스의 parseInt에는

parseInt(string, radix) 로 되어 있음.
redix의 기본값은 8이고 string의 진수를 의미함.

즉... IE5에선 기본 8진수로 인식하는 문제.
상위버전 브라우저에서는 기본 10진수로 표시하는것 같음.

앞으로는 웹표준을 위해... 진수까지 표시해주는 것을 권장.
function test(val){
    if(parseInt(val) < 10){
        val = '0' + parseInt(val, '10');
    }
    return val;
}


내용추가

parseInt()는 자신이 읽어들이지 못하는 수에서 동작이 멈춤니다.
parsetInt(\'08\'); 처럼 인자가 문자열일 경우 앞에 0이 붙으면
8진수가 됩니다.

즉, 자신도 모르게 parseInt(\'08\',8) 로 되어 버리는 것입니다.
8진수는 0 ~7 까지만 숫자로 인식하므로 앞에 0을
읽고 뒤에 8은 읽을 수 없어서 버려집니다.
그래서 0이 반환되는 것이지 에러는 아닙니다.

하지만 문자열이 아니면 다르게 동작할까?

parseInt(08,8)은 NaN을 반환합니다.
숫자 08은 8로 해석됩니다.
즉, parseInt(8,8)과 같습니다.

parseInt는 자신이 숫자를 한 번도 해석하지 않았다면
NaN을 반환합니다.

위의 두 예제가 다른 결과를 반환하지만 8진수로 해석되었을 경우
0~7까지만 숫자로 인정하고 그 이상은 숫자로 인정하지 않는 것은 똑같습니다.

댓글
댓글쓰기 폼
공지사항
Total
51,684
Today
5
Yesterday
37
링크
«   2020/10   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함