JS驗證18位身份證號的正確性

阿童木發表於2018-11-01

今天遇到了一個需要驗證身份證號的正確性的問題,依據判斷規則。自己寫了下。希望大家多多補充

規則: 身份證號碼校驗:

  1. 首先校驗長度:15位和18位是可通過校驗的

  2. 然後校驗編碼邏輯,15位身份證號無需校驗,校驗18位身份證號步驟如下: 1)將身份證號前17位分別乘以下列係數:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 2)將步驟1)中的結果相加 3)將步驟2)中的結果除以11,得到餘數 4)餘數0,1,2,3,4,5,6,7,8,9,10分別對應身份證號最後一位1,0,X,9,8,7,6,5,4,3,2

      例子:以我的身份證號為例,230106199003190813,按照步驟計算過程如下:
                  1)2*7=14,3*9=27,1*5=5,6*4=24,1*2=2,9*1=9,9*6=54,3*9=27,1*10=10,9*5=45,8*4=32,1*2=2
                  2)14+27+5+24+2+9+54+27+10+45+32+2  =  251
                  3)251  mod  11  =  9
                  4)餘數9對應身份證號最後一位是3
                  我的身份證號碼通過校驗
    複製程式碼

身份證號碼提取有效資訊:

  1. 性別:擷取身份證號碼15-17位,如果是奇數,則為男性;如果是偶數,則為女性。以上面的例子來說明,15-17位是081,是奇數,判斷為男性

  2. 出生日期:擷取身份證號碼7-10位,是出生年 擷取身份證號碼11-12位,是出生月 擷取身份證號碼13-14位,是出生日 以上面的例子來說明:7-10位是1990,是我出生的年。月和日同理,不再贅述

首先取到身份證號的值:我這裡用idcard;

var pattern = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X|x)$/;

	if (!pattern.test(idcard) || idcard == "") {
		alert("請輸入正確的身份證號");
		return false;
	}else{
		var such = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
		var sum = 0;
		for(var i = 0;i <idcard.length-1;i++){
			for(var j = 0;j<such.length;j++){
				var product = idcard[i]*such[j];
				sum += product;
			}
			
		}
		var result = sum % 11;
		var example = ['1','0','X','9','8','7','6','5','4','3','2'];
		if(idcard[17] == example[result]){
			alert("正確");
		}else{
			alert("錯誤");
			return false;
		}
		
		
	}
複製程式碼

相關文章