第一个校验来自于学长:
function isIdCardNo(num) {
// 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
num = num.toUpperCase();
// 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
alert("输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。");
return false;
}
// 下面分别分析出生日期和校验位
var len;
var re;
len = num.length;
if (len == 15) {
re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
// 检查生日日期是否正确
var arrSplit = num.match(re);
var dtmBirth = new Date("19" + arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
var bGoodDay;
bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) {
alert("输入的身份证号里出生日期不对!");
return false;
} else {
// 将15位身份证转成18位 ,校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0;
num = num.substr(0, 6) + "19" + num.substr(6, num.length - 6);
for(var i = 0; i < 17; i ++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
num += arrCh[nTemp % 11];
return true;
}
}
// 身份证ID为18为的时候
if (len == 18) {
re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
// 检查生日日期是否正确
var arrSplit = num.match(re);
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) {
alert("输入的身份证号里出生日期不对!");
return false;
}
else {
// 检验18位身份证的校验码是否正确。 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var valnum;
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0;
for(var i = 0; i < 17; i ++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
valnum = arrCh[nTemp % 11];
if (valnum != num.substr(17, 1)) {
alert("18位身份证的校验码不正确!末位应该为:" + valnum);
return false;
}
return true;
}
}
return false;
}
第二个校验来自于项目中:
function gf_check_identity(as_identity) {
var ls_identity_no;
var ls_year,ls_month,ls_day,ls_date;
var ls_today;
var ll_year;
var ll_identity_no_len;
ls_identity_no = as_identity;
ls_today = new Date();
ls_current = ls_today.getYear()+'/'+(ls_today.getMonth()+1)+'/'+ls_today.getDate();
ll_identity_no_len=ls_identity_no.length;
if (/^\s*$/.test(ls_identity_no) ) {
alert("身份证号码不能为空!");
return false;
}
else if (!(ll_identity_no_len==15 || ll_identity_no_len == 18))
{
alert("身份证号码位数不正确,请检查输入情况!");
return false;
}
//alert('length==' + ll_identity_no_len);
if (ll_identity_no_len == 15) { //身份证为 15 处理, 认为15位的年 = 19**
// alert("YYYYYYYYYYYYYY");
ls_year = ls_identity_no.substring(6,8);
ls_month = ls_identity_no.substring(8,10);
ls_day = ls_identity_no.substring(10,12);
ls_year = '19' + ls_year//year is only 20 century
ls_date = ls_year +'/' + ls_month +'/' + ls_day;
}
else {
// alert("XXXXXXXXXXXXX");
ls_year = ls_identity_no.substring(6,10);
if (!(ls_year.substring(0,2) == '19' || ls_year.substring(0,2)== '20')){
alert("身份证号码中的出生年份不正确, 请您重新输入!");
return false;
}
ls_month = ls_identity_no.substring(10,12);
ls_day = ls_identity_no.substring(12,14);
ls_date = ls_year +'/' + ls_month +'/' + ls_day
}
//alert('ls_month==' + ls_month);
if (ls_month > '12') {
alert("身份证号码中的出生月份不能大于12, 请您重新输入 ");
return false;
}
else if (ls_month <= '00') {
alert("身份证号码中的出生月份不能小于01, 请您重新输入 ");
return false;
}
if (ls_day <= '00') {
alert("身份证号码的出生日小于01, 请您重新输入 ");
return false;
}
switch (ls_month) {
case '01'://大月的处理
case '03':
case '05':
case '07':
case '08':
case '10':
case '12':
if (ls_day > '31') {
alert("身份证号码的出生日大于31, 请您重新输入");
return false;
}
break;
case '04': //小月的处理
case '06':
case '09':
case '11':
if (ls_day > '30' ) {
alert("身份证号码的出生日大于30(本月无31日), 请您重新输入");
return false;
}
break;
case '02': //平年和闰年的处理
ll_year = parseInt(ls_year);
if ((ll_year%4== 0 && ll_year%100!=0) || ll_year%400==0) { //闰年,二月份不能多于29天
if (ls_day > '29') {
alert("闰年的二月份没有" + ls_day + "日,请重新输入出生日期");
return fasle;
}
}
else {//平年二月份不能大于28天
if (ls_day > '28') {
alert("平年的二月份没有" + ls_day + "日,请重新输入出生日期");
return false;
}
}
}
if (Date.parse(ls_date) > Date.parse(ls_current)) {
alert("身份证号码的出生日期小于登记日期,不合理请您重新输入");
return false;
}
if (ll_identity_no_len == 18) {//18位的校验码的检验
var lastS = ls_identity_no.substring(ls_identity_no.length-1,ls_identity_no.length);
var code = getVertifyCode(ls_identity_no.substring(0,17));
if (lastS!=code)
{
alert("身份证检验码不正确,请您重新输入");
return false;
}
}
return true;
}
/**
取得18位身份证号码的检验码,入参为身份证号码前17位
*/
function getVertifyCode(identify) {
var factors = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4, 2];
var codes = ['1','0','X','9','8','7','6','5','4','3','2'];
var sum = 0;
var temp = 0;
for (var j=0; j<factors.length; j++)
{
temp = parseInt(identify.charAt(j)+"")*factors[j];
sum += temp;
}
var re = sum%11;
return codes[re];
}
第一种方式校验身份证中的日期采用的正则表达式,第二种方式用的JS判断的。
分享到:
相关推荐
Jupyter-Notebook
Jupyter-Notebook
高效甘特图模板下载-精心整理.zip
lstm Summary Framework: z = U>x, x u Uz Criteria for choosing U: • PCA: maximize projected variance • CCA: maximize projected correlation • FDA: maximize projected intraclass variance
OpenGL调试工具,适合图形开发者,包括视频开发,播放器开始以及游戏开发者。
全国行政区划shp最新图.zip
全国研究生招生与在校数据+国家线-最新.zip
Jupyter-Notebook
直播电商交流平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本
2000-2020年沪深A股上市公司融资约束程度SA指数-最新数据发布.zip
PPT模版资料,PPT模版资料
CPA注会考试最新教材资料-最新发布.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
内容概要:本文提供了一个完整的职工管理系统的C++源代码。通过面向对象的编程方法,实现了包括创建新职工、查询、增加、修改、删除、排序、统计以及存储和恢复职工数据在内的多个基本操作功能。该系统支持不同的用户角色(如管理员与老板),并通过菜单驱动方式让用户方便地进行相关操作。此外,还包括了错误检测机制,确保操作过程中的异常得到及时处理。 适合人群:有一定C++语言基础,特别是面向对象编程经验的程序员;企业管理人员和技术开发人员。 使用场景及目标:适用于中小型企业内部的人力资源管理部门或IT部门,用于维护员工基本信息数据库,提高工作效率。通过本项目的学习可以加深对链表、类和对象的理解。 阅读建议:建议先熟悉C++的基本语法和面向对象概念,再深入学习代码的具体实现细节。对于关键函数,比如exchange、creatilist等,应当重点关注并动手实践以加强理解。
Jupyter-Notebook
考研公共课历年真题集-最新发布.zip
Huawei-HKUST Joint Workshop on Theory for Future Wireless 15-16 September 2022 华为-香港科技大学未来无线理论联合研讨会 Speaker:Jingwen Tong
演出人员与观众疫情信息管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本.pdf