身份證号碼中的校驗碼是身份證号碼的最後一位,是根據〖中華人民共和國國家标準GB 11643-1999〗中有關公民身份号碼的規定,
根據精密的計算公式計算出來的,公民身份号碼是特征組合碼,由十七位數字本體碼和一位數字校驗碼組成。
計算方法
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位數字上出現羅馬數字的Ⅹ。如果餘數是10,身份證的最後一位号碼就是2;
例如:某男性的身份證号碼是34052419800101001X。我們要看看這個身份證是不是合法的身份證。首先:我們計算3*7+4*9+0*10+5*5+...+1*2,前17位的乘積和是189
然後:
用189除以11得出的結果是商17餘2最後:通過對應規則就可以知道餘數2對應的數字是x。是以,這是一個合格的身份證号碼。
js代碼:
1 function check_id(){
2 var idcode= document.getElementById("IDNumber").value
3 // alert(idcode)
4 //檢測身份證号碼合法性---全部數字或數字+X/x 18位
5 // 權重因子
6 var weight_factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
7 // 校驗碼
8 var check_code = ['1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'];
9
10 var code = idcode + "";
11 var last = idcode[17];//最後一位
12
13 var seventeen = code.substring(0,17);
14
15 // ISO 7064:1983.MOD 11-2
16 // 判斷最後一位校驗碼是否正确
17 var arr = seventeen.split("");
18 var len = arr.length;
19 var num = 0;
20 for(var i = 0; i < len; i++){
21 num = num + arr[i] * weight_factor[i];
22 }
23
24 // 擷取餘數
25 var resisue = num%11;
26 var last_no = check_code[resisue];
27
28 // 格式的正則
29 // 正則思路
30 /*
31 第一位不可能是0
32 第二位到第六位可以是0-9
33 第七位到第十位是年份,是以七八位為19或者20
34 十一位和十二位是月份,這兩位是01-12之間的數值
35 十三位和十四位是日期,是從01-31之間的數值
36 十五,十六,十七都是數字0-9
37 十八位可能是數字0-9,也可能是X
38 */
39 var idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/;
40
41 // 判斷格式是否正确
42 var format = idcard_patter.test(idcode);
43 // alert(format)
44 // 傳回驗證結果,校驗碼和格式同時正确才算是合法的身份證号碼
45 // return last === last_no && format ? true : false;
46 if(!(format==true && (last_no===last))){
47 alert("身份證号碼格式輸入有誤!")
48 document.getElementById("IDNumber").focus();
49 }
50 }