一代身份證號(hào)碼是十五位场绿, 2013年1月1日開始,咱們中國(guó)全面停止使用一代身份證了嫉入。
二代身份證號(hào)碼:
- 1-6位:表示行政區(qū)劃的代碼焰盗。
- 1璧尸、2位,所在拾揪堋(直轄市爷光,自治區(qū))代碼;
- 3澎粟、4位蛀序,所在地級(jí)市(自治州)代碼;
- 5活烙、6位徐裸,所在區(qū)(縣,自治縣啸盏,縣級(jí)市)的代碼重贺;
- 7-14位:表示出生年、月回懦、日
- 15-16位:所在地派出所代碼
- 17位:性別气笙。奇數(shù)(1、3怯晕、5潜圃、7、9)男性贫贝,偶數(shù)(2秉犹、4、6稚晚、8崇堵、0)女性
- 18位:校驗(yàn)位,存在十一個(gè)值:0,1,2,3,4,5,6,7,8,9,X客燕,其值是用固定公式根據(jù)前面十七位計(jì)算出來的鸳劳。
第十八位的數(shù)字是根據(jù)ISO 7064:1983.MOD 11-2校驗(yàn)碼算法計(jì)算出來的
// 函數(shù)參數(shù)必須是字符串,因?yàn)槎矸葑C號(hào)碼是十八位也搓,而在javascript中赏廓,十八位的數(shù)值會(huì)超出計(jì)算范圍,造成不精確的結(jié)果傍妒,導(dǎo)致最后兩位和計(jì)算的值不一致幔摸,從而該函數(shù)出現(xiàn)錯(cuò)誤。
function checkIDCard(idcode){
// 加權(quán)因子
var weight_factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
// 校驗(yàn)碼
var check_code = ['1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'];
var code = idcode + "";
var last = idcode[17];//最后一位
var seventeen = code.substring(0,17);
// ISO 7064:1983.MOD 11-2
// 判斷最后一位校驗(yàn)碼是否正確
var arr = seventeen.split("");
var len = arr.length;
var num = 0;
for(var i = 0; i < len; i++){
num = num + arr[i] * weight_factor[i];
}
// 獲取余數(shù)
var resisue = num%11;
var last_no = check_code[resisue];
// 格式的正則
// 正則思路
/*
第一位不可能是0
第二位到第六位可以是0-9
第七位到第十位是年份颤练,所以七八位為19或者20
十一位和十二位是月份既忆,這兩位是01-12之間的數(shù)值
十三位和十四位是日期,是從01-31之間的數(shù)值
十五,十六患雇,十七都是數(shù)字0-9
十八位可能是數(shù)字0-9跃脊,也可能是X
*/
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])$/;
// 判斷格式是否正確
var format = idcard_patter.test(idcode);
// 返回驗(yàn)證結(jié)果,校驗(yàn)碼和格式同時(shí)正確才算是合法的身份證號(hào)碼
return last === last_no && format ? true : false;
}