JAVASCRIPT

    주민/외국인 등록번호
    • 조회수 2,832
    • 작성일 2008-07-29
    •  
    /*
    Creator : shj at xenosi.de

    if(false == (birth = checkPersonalNo(주민번호))) 틀렸어요;
    년 = birth[0];
    월 = birth[1];
    일 = birth[2];
    if(birth[3]) 외국인;
    */

    function checkPersonalNo(personal_no)
    {
        personal_no = personal_no.replace(/[^\d]+/g, '');
        pattern = /^[0-9]{6}[1-8][0-9]{6}$/;

        if(!pattern.test(personal_no)) {
            return false;
        }
        var birth = new Array();
        birth[0] = personal_no.substr(0, 2);
        switch(personal_no.charAt(6)) {
        case '1':
        case '2':
            birth[0] = ('19' + birth[0]) * 1;
            birth[3] = false;
            break;
        case '3':
        case '4':
            birth[0] = ('20' + birth[0]) * 1;
            birth[3] = false;
            break;
        case '5':
        case '6':
            birth[0] = ('19' + birth[0]) * 1;
            birth[3] = true;
            break;
        case '7':
        case '8':
            birth[0] = ('20' + birth[0]) * 1;
            birth[3] = true;
            break;
        /*case '9': // 이렇게 늙은 사람은 있어도 안받아요. 위의 정규식에서 안받음.
        case '0':
            birth[0] = ('18' + birth[0]) * 1;
            birth[3] = true;
            break;*/
        }

        birth[1] = personal_no.substr(2, 2) * 1;
        birth[2] = personal_no.substr(4, 2) * 1;

        if(birth[1] < 1 || birth[1] > 12) {
            return false;
        }
        if(birth[2] < 1 || birth[2] > 31) {
            return false;
        }
        var check = 0;
        var mul = 2;

        if(birth[3]) {
            if(((personal_no.charAt(7) * 10 + personal_no.charAt(8)) % 2) != 0) {
                return false;
            }
        }
        for(i = 0; i < 12; i ++) {
            check += personal_no.charAt(i) * mul;
            mul ++;
            if(mul > 9) {
                mul = 2;
            }
        }

        check = 11 - (check % 11);

        if(check > 9) {
            check %= 10;
        }
        if(birth[3]) {
            check += 2;
            if(check > 9) {
                check %= 10;
            }
        }
        if(check != personal_no.charAt(12)) {
            return false;
        }
        return birth;
    }


    /*
    License : Public Domain
    */