身份證號碼組成
公民身份號碼是一系列組合碼,由十七位數字本體碼和一位校驗碼組成。
排列順序從左至右依次爲:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位校驗碼。
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')