javascript身份證號碼驗證
阿新 • • 發佈:2017-09-16
返回 markdown user 問題 spa div mod 偶數 efi https://github.com/oxcow/id-number-validator
版權聲明:
- 關於《javascript身份證號碼驗證》的一切權利歸作者@Leeyee所有;
- 非商用、非衍生;
- 如需轉載需要註明來源於http://iyiguo.net/blog/2013/07/31/javascript-idcard-validate/
- 15位身份證號碼編碼規則
- 18位身份證號碼編碼規則
- 校驗規則
- javascript編碼實現
- 源代碼
- 驗證示例
15位身份證號碼編碼規則
ddddddyymmddxxp
- dddddd: 地區碼
- yymmdd: 出生年月日
- xx: 順序類編碼,無法確定
- p: 性別。奇數位男,偶數為女
18位身份證號碼編碼規則
ddddddyyyymmddxxxy
- dddddd: 地區碼
- yyyymmdd: 出生年月日
- xxx:順序類編碼,無法確定。奇數為男,偶數為女
- y: 校驗位。可通過前17位計算獲取
校驗規則
-
加權因子Wi
從右到左依次定義為:
Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
-
校驗位值
Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
其中 10 身份證中用 X 替代。
-
校驗位位置
Y_P = mod(Σ(Ai+Wi),11)
其中下標 i 為身份證號碼 從右往左 的 2…8 位; Ai為身份證號對應位數值。
該公式表示將身份證的前17位與其對應的加權因子 Wi 相乘並求和,再將得到的結果與 11 求模,所得的結果即為校驗位值所在的位置。然後直接在校驗位值 Y 中查找即可得到校驗位值.
比如有一為 330304197002051590 的身份證號,那麽最後一位校驗位 0 的驗證過程如下:
-
加權求和
3×7 + 3×9 + 0×10 + 3×5 + 0×8 + 4×4 + 1×2 + 9×1 + 7×6 + 0×3 + 0×7 + 2×9 + 0×10 + 5×5 + 1×8 + 5×4 + 9×2 = 221
-
求模
221 % 11 = 1
-
獲取驗證位數值
Y[1] = 0
javascript編碼實現
針對上述身份證生成規則的描述,在驗證時針對15位身份證號只需要判斷其出生日期是否正確即可;而針對18位身份證號,除了驗證出生日期外還需要對最後的校驗位進行驗證。
因此我們命名一個名為getIdCardInfo
的函數,接受身份證號作為參數進行驗證。該函數返回身份證信息對象。該對象具有5個屬性,分別為:
- isTrue : 身份證號是否有效。默認為 false
- year : 出生年。默認為null
- month : 出生月。默認為null
- day : 出生日。默認為null
- isMale : 是否為男性。默認false
- isFemale : 是否為女性。默認false
源代碼
您可進入該項目的GitHub頁進行下載或貢獻
function getIdCardInfo(cardNo) {
var info = {
isTrue : false,
year : null,
month : null,
day : null,
isMale : false,
isFemale : false
};
if (!cardNo || (15 != cardNo.length && 18 != cardNo.length) ) {
info.isTrue = false;
return info;
}
if (15 == cardNo.length) {
var year = cardNo.substring(6, 8);
var month = cardNo.substring(8, 10);
var day = cardNo.substring(10, 12);
var p = cardNo.substring(14, 15); //性別位
var birthday = new Date(year, parseFloat(month) - 1,
parseFloat(day));
// 對於老身份證中的年齡則不需考慮千年蟲問題而使用getYear()方法
if (birthday.getYear() != parseFloat(year)
|| birthday.getMonth() != parseFloat(month) - 1
|| birthday.getDate() != parseFloat(day)) {
info.isTrue = false;
} else {
info.isTrue = true;
info.year = birthday.getFullYear();
info.month = birthday.getMonth() + 1;
info.day = birthday.getDate();
if (p % 2 == 0) {
info.isFemale = true;
info.isMale = false;
} else {
info.isFemale = false;
info.isMale = true
}
}
return info;
}
if (18 == cardNo.length) {
var year = cardNo.substring(6, 10);
var month = cardNo.substring(10, 12);
var day = cardNo.substring(12, 14);
var p = cardNo.substring(14, 17)
var birthday = new Date(year, parseFloat(month) - 1,
parseFloat(day));
// 這裏用getFullYear()獲取年份,避免千年蟲問題
if (birthday.getFullYear() != parseFloat(year)
|| birthday.getMonth() != parseFloat(month) - 1
|| birthday.getDate() != parseFloat(day)) {
info.isTrue = false;
return info;
}
var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];// 加權因子
var Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];// 身份證驗證位值.10代表X
// 驗證校驗位
var sum = 0; // 聲明加權求和變量
var _cardNo = cardNo.split("");
if (_cardNo[17].toLowerCase() == ‘x‘) {
_cardNo[17] = 10;// 將最後位為x的驗證碼替換為10方便後續操作
}
for ( var i = 0; i < 17; i++) {
sum += Wi[i] * _cardNo[i];// 加權求和
}
var i = sum % 11;// 得到驗證碼所位置
if (_cardNo[17] != Y[i]) {
return info.isTrue = false;
}
info.isTrue = true;
info.year = birthday.getFullYear();
info.month = birthday.getMonth() + 1;
info.day = birthday.getDate();
if (p % 2 == 0) {
info.isFemale = true;
info.isMale = false;
} else {
info.isFemale = false;
info.isMale = true
}
return info;
}
return info;
}
驗證示例
相關閱讀:- javascript身份證號碼驗證
- javascript中的null和undefined
- jQuery插件編寫
- jQuery eTable Plugin
- jQuery MsgBox Plugin
- 一些關於javascript、jQuery使用時的建議
http://iyiguo.net/blog/2013/07/31/javascript-idcard-validate/
javascript身份證號碼驗證