JS校驗身份證號的合法性

小時光不期而遇發表於2019-02-22

前端表單中有身份證號的校驗,下邊是用JS來校驗身份證號的合法性。

中國居民身份證號碼編碼規則

  第一、二位表示省(自治區、直轄市、特別行政區)。 

  第三、四位表示市(地級市、自治州、盟及國家直轄市所屬市轄區和縣的彙總碼)。其中,01-20,51-70表示省直轄市;21-50表示地區(自治州、盟)。 

  第五、六位表示縣(市轄區、縣級市、旗)。01-18表示市轄區或地區(自治州、盟)轄縣級市;21-80表示縣(旗);81-99表示省直轄縣級市。 

  第七、十四位表示出生年月日(單數字月日左側用0補齊)。其中年份用四位數字表示,年、月、日之間不用分隔符。例如:1981年05月11日就用19810511表示。 

  第十五、十七位表示順序碼。對同地區、同年、月、日出生的人員編定的順序號。其中第十七位奇數分給男性,偶數分給女性。 

  第十八位表示校驗碼。作為尾號的校驗碼,是由號碼編制單位按統一的公式計算出來的,校驗碼如果出現數字10,就用X來代替,詳情參考下方計算方法。

    1. 其中第一代身份證號碼為15位。年份兩位數字表示,沒有校驗碼。
    2. 前六位詳情請參考省市縣地區程式碼
    3. X是羅馬字元表示數字10,羅馬字元(1-12):Ⅰ、Ⅱ、Ⅲ、Ⅳ、Ⅴ、Ⅵ、Ⅶ、Ⅷ、Ⅸ、Ⅹ、Ⅺ、Ⅻ……,詳情請參考羅馬字元

中國居民身份證校驗碼演算法

  步驟如下:

    1. 將身份證號碼前面的17位數分別乘以不同的係數。

      從第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

    2. 將這17位數字和係數相乘的結果相加。

    3. 用加出來和除以11,取餘數。

    4. 餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。

      其分別對應的最後一位身份證的號碼為1-0-X-9-8-7-6-5-4-3-2。

    5. 通過上面計算得知如果餘數是3,第18位的校驗碼就是9。

      如果餘數是2那麼對應的校驗碼就是X,X實際是羅馬數字10。

    例如:某男性的身份證號碼為【53010219200508011x】, 我們看看這個身份證是不是合法的身份證。

       首先我們得出前17位的乘積和

        【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,

       然後用189除以11得出的結果是189/11=17—-2,也就是說其餘數是2。

       最後通過對應規則就可以知道餘數2對應的檢驗碼是X。所以,可以判定這是一個正確的身份證號碼。

 

JS校驗身份證合法性

  

        if (len == 18) {
                re = new RegExp(/^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9]|X)$/);
                var arrSplit = value.match(re);  //檢查生日日期是否正確,value就是身份證號
                var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
                var bGoodDay; 
                bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
                if (!bGoodDay) {
                    //alert(dtmBirth.getYear());
                    //alert(arrSplit[2]);
                    //alert(`輸入的身份證號裡出生日期不對!`);
                    return false;
                }
                else { //檢驗18位身份證的校驗碼是否正確。 //校驗位按照ISO 7064:1983.MOD 11-2的規定生成,X可以認為是數字10。
                    var valnum;
                    var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                    var arrCh = new Array(`1`, `0`, `X`, `9`, `8`, `7`, `6`, `5`, `4`, `3`, `2`);
                    var nTemp = 0, i;
                    for(i = 0; i < 17; i ++) {
                        nTemp += value.substr(i, 1) * arrInt[i];
                    }
                    valnum = arrCh[nTemp % 11];
                    if (valnum != value.substr(17, 1)) {
                        //alert(`18位身份證的校驗碼不正確!應該為:` + valnum);
                        return false;
                    }
                    return true;
                }
            }

 對照上邊的中國居民身份證校驗碼演算法,校驗身份證的程式碼就很好理解了

 

 -THE END-

 

相關文章