1. 程式人生 > >身份證驗證思路及程式碼

身份證驗證思路及程式碼

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <pre>
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、通過上面得知如果餘數是2,就會在身份證的第18位數字上出現羅馬數字的X。
例如:某男性的身份證號碼是34052419800101001X。我們要看看這個身份證是不是合法的身份證。
首先:我們計算3*7+4*9+0*10+5*5+...+1*2,前17位的乘積和是189
然後:用189除以11得出的結果是商17餘2
最後:通過對應規則就可以知道餘數2對應的數字是x。所以,這是一個合格的
        
</pre> <!--35 89 01 80 69 72 41 7--> <input type="text" value='34052419800101001X' /> <button onclick="check()">校驗</button> <script type="text/javascript"> var oInput = document.getElementsByTagName("input")[0];
var coefficient = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 係數陣列 var checkArr = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2]; // 校驗陣列 var year, month, day; function check(){ var val = oInput.value; if(val && val.length == 18
){ var lastBitCheck = checkNum(sumIdCard(val.slice(0,17)), val.slice(-1)); // 末位校驗 year = val.slice(6,10); month = val.slice(10, 12); day = val.slice(12, 14); var yearCheck = checkYear(year); var monthCheck = checkMonth(month); var dayCheck = checkDay(year, month, day); switch(false){ case lastBitCheck: console.log("末位校驗失敗"); break; case yearCheck: console.log("出生年份校驗失敗"); break; case monthCheck: console.log("出生月份校驗失敗"); break; case dayCheck: console.log("出生日期校驗失敗"); break; default:; } var res = lastBitCheck && yearCheck && monthCheck && dayCheck; // console.log(year, month, day); console.log("校驗結果", res); return res; }else{ // console.log("長度有誤"); return false; } } function doubleNum (n){ if(n === undefined || n === null){ return ""; } n = String(n); if(n.length > 2){ return n }else{ n = "0" + n; return n.slice(-2); } } function sumIdCard(str){ // 傳入IMEI的前14位 var res = 0, tempNum, tempStr; for(let i = 0, len = str.length; i < len; i++){ res += Number(str[i]) * coefficient[i]; } // console.log(res); return res; } function checkNum(num, t){ // 校驗位校驗 num:sumIdCard的結果,t:idCard的最後一位校驗位 // console.log(num, t) var rightTestNum = checkArr[num % 11]; console.log("正確的校驗位", rightTestNum); if(String(rightTestNum).toUpperCase() == String(t).toUpperCase()){ return true; }else{ return false; } } function checkYear(year){ year = Number(year); return (year >= 1800 && year <= new Date().getFullYear()) ? true : false; } function checkMonth(month){ month = Number(month); return (month >= 1 && month <= 12) ? true : false; } function checkDay(year, month, day){ year = Number(year); month = Number(month); day = Number(day); var d31 = [1, 3, 5, 7, 8, 10, 12]; // 31天的月份 var d30 = [4, 6, 9, 11]; // 30天的月份 if(d31.indexOf(month) != -1){ return (day >= 1 && day <= 31) ? true : false; }else if(d30.indexOf(month) != -1){ return (day >= 1 && day <= 30) ? true : false; }else if(month == 2){ if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){ return (day >= 1 && day <= 29) ? true : false; }else{ return (day >= 1 && day <= 28) ? true : false; } }else{ // console.error(month,"月份錯了(1-12)") return false; } } </script> </body> </html>