前端表單中有身份證號的校驗,下邊是用JS來校驗身份證號的合法性。
中國居民身份證號碼編碼規則
第一、二位表示省(自治區、直轄市、特別行政區)。
第三、四位表示市(地級市、自治州、盟及國家直轄市所屬市轄區和縣的彙總碼)。其中,01-20,51-70表示省直轄市;21-50表示地區(自治州、盟)。
第五、六位表示縣(市轄區、縣級市、旗)。01-18表示市轄區或地區(自治州、盟)轄縣級市;21-80表示縣(旗);81-99表示省直轄縣級市。
第七、十四位表示出生年月日(單數字月日左側用0補齊)。其中年份用四位數字表示,年、月、日之間不用分隔符。例如:1981年05月11日就用19810511表示。
第十五、十七位表示順序碼。對同地區、同年、月、日出生的人員編定的順序號。其中第十七位奇數分給男性,偶數分給女性。
第十八位表示校驗碼。作為尾號的校驗碼,是由號碼編制單位按統一的公式計算出來的,校驗碼如果出現數字10,就用X來代替,詳情參考下方計算方法。
中國居民身份證校驗碼演算法
步驟如下:
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-