校驗18位身份證號碼(判斷最後一位校驗位和性別)

身份證號碼組成

  

公民身份號碼是一系列組合碼,由十七位數字本體碼和一位校驗碼組成。

排列順序從左至右依次爲:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位校驗碼。 

18位身份證最後一位校驗碼的計算方法

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

舉例: 某女生的身份證號碼爲【36073119960518294X】

①【(3*7)+(6*9)+(0*10)+(7*5)+(3*8)+(1*4)+(1*2)+(9*1)+(9*6)+(6*3)+(0*7)+(5*9)+(1*10)+(8*5)+(2*8)+(9*4)+(4*2)】= 376

② 376除以11等於34餘2

③ 餘數2對應【1-0-X-9-8-7-6-5-4-3-2】的校驗碼剛好是X

④ 該身份證號碼正確

判斷性別

判斷身份證號碼第17位,奇數代表男性, 偶數代表女性

【36073119960518294X】:4爲偶數,女性

【53010219200508011X】:1爲奇數, 男性

js校驗身份證(校驗位和性別)

function isTrueIdCard(idCard) {
  let mainLand = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}X)$)$/;
  let Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];// 加權因子 
  let ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];// 身份證驗證位值,10代表X 
  let sum = 0; // 聲明加權求和變量 
  let remainder // 餘數
  let lastCode = idCard[17] // 最後一位
  // 將最後位爲x的驗證碼替換爲10方便後續操作
  if (lastCode == 'x' || lastCode == 'X') {
    lastCode = 10;
  }

  // 校驗身份證號碼
  if (!mainLand.test(idCard)) {
    alert('身份證格式有誤')
    return
  }

  // 校驗身份證最後一位
  for (let i = 0; i < 17; i++) {
    // 循環遍歷前17位,加權求和 
    let tempnum = idCard.substring(i, i + 1);
    sum += Wi[i] * tempnum;
  }
  // 得到餘數
  remainder = sum % 11;
  // 判斷校驗位和對應驗證位是否相等
  if (lastCode == ValideCode[remainder]) {
    alert('校驗位正確')
  } else {
    alert('校驗位錯誤')
  }

  // 判斷性別
  let sexCode = idCard[16]
  if (sexCode % 2 == 0) {
    alert('女生')
  } else {
    alert('男生')
  }
}

isTrueIdCard('36073119960518294X')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章