javascript身份证号码验证
版權聲明:
關于《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身份证号码验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在PowerShell中获取本地的RAM
- 下一篇: vue农历日历