超精准的javascript验证身份证号的具体实现方法


Posted in Javascript onNovember 18, 2015

编写程序前先来了解下身份证号的构成:

身份证号分为两种,旧的为15位,新的为18位。

身份证15位编码规则:dddddd yymmdd xx p   

其中 dddddd:地区码    yymmdd: 出生年月日    xx: 顺序类编码,无法确定    p: 性别,奇数为男,偶数为女;

身份证18位编码规则:dddddd yyyymmdd xxx y   

其中 dddddd:地区码    yyyymmdd: 出生年月日     xxx:顺序类编码,无法确定,奇数为男,偶数为女    y: 校验码,该位数值可通过前17位计算获得,计算的公式见程序,一些需要用到的常数

18位号码加权因子为(从右到左) 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 ]    校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )    

i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置。

var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 
var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];   // 身份证验证位值.10代表X 
function IdCardValidate(idCard) { 
 idCard = trim(idCard.replace(/ /g, ""));    //去掉字符串头尾空格      
 if (idCard.length == 15) { 
  return isValidityBrithBy15IdCard(idCard);  //进行15位身份证的验证 
 } else if (idCard.length == 18) { 
  var a_idCard = idCard.split("");    // 得到身份证数组 
  if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){ //进行18位身份证的基本验证和第18位的验证
   return true; 
  }else { 
   return false; 
  } 
 } else { 
  return false; 
 } 
} 
/** 
 * 判断身份证号码为18位时最后的验证位是否正确 
 * @param a_idCard 身份证号码数组 
 * @return 
 */ 
function isTrueValidateCodeBy18IdCard(a_idCard) { 
 var sum = 0;        // 声明加权求和变量 
 if (a_idCard[17].toLowerCase() == 'x') { 
  a_idCard[17] = 10;     // 将最后位为x的验证码替换为10方便后续操作 
 } 
 for ( var i = 0; i < 17; i++) { 
  sum += Wi[i] * a_idCard[i];   // 加权求和 
 } 
 valCodePosition = sum % 11;    // 得到验证码所位置 
 if (a_idCard[17] == ValideCode[valCodePosition]) { 
  return true; 
 } else { 
  return false; 
 } 
} 
/** 
 * 验证18位数身份证号码中的生日是否是有效生日 
 * @param idCard 18位书身份证字符串 
 * @return 
 */ 
function isValidityBrithBy18IdCard(idCard18){ 
 var year = idCard18.substring(6,10); 
 var month = idCard18.substring(10,12); 
 var day = idCard18.substring(12,14); 
 var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
 // 这里用getFullYear()获取年份,避免千年虫问题 
 if(temp_date.getFullYear()!=parseFloat(year) 
   ||temp_date.getMonth()!=parseFloat(month)-1 
   ||temp_date.getDate()!=parseFloat(day)){ 
   return false; 
 }else{ 
  return true; 
 } 
} 
 /** 
 * 验证15位数身份证号码中的生日是否是有效生日 
 * @param idCard15 15位书身份证字符串 
 * @return 
 */ 
 function isValidityBrithBy15IdCard(idCard15){ 
  var year = idCard15.substring(6,8); 
  var month = idCard15.substring(8,10); 
  var day = idCard15.substring(10,12); 
  var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
  // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 
  if(temp_date.getYear()!=parseFloat(year) 
    ||temp_date.getMonth()!=parseFloat(month)-1 
    ||temp_date.getDate()!=parseFloat(day)){ 
    return false; 
  }else{ 
   return true; 
  } 
 } 
//去掉字符串头尾空格 
function trim(str) { 
 return str.replace(/(^\s*)|(\s*$)/g, ""); 
}

 根据身份证号对其进行性别的判定

/** 
 * 通过身份证判断是男是女 
 * @param idCard 15/18位身份证号码 
 * @return 'female'-女、'male'-男 
 */ 
function maleOrFemalByIdCard(idCard){ 
 idCard = trim(idCard.replace(/ /g, ""));  // 对身份证号码做处理。包括字符间有空格。 
 if(idCard.length==15){ 
  if(idCard.substring(14,15)%2==0){ 
   return 'female'; 
  }else{ 
   return 'male'; 
  } 
 }else if(idCard.length ==18){ 
  if(idCard.substring(14,17)%2==0){ 
   return 'female'; 
  }else{ 
   return 'male'; 
  } 
 }else{ 
  return null; 
 } 
}

以上就是javascript验证身份证号的具体实现方法,并且根据身份证能验证性别,是不是很神奇,欢迎大家学习借鉴。

Javascript 相关文章推荐
JavaScript 开发中规范性的一点感想
Jun 23 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
Dec 25 Javascript
JS简单实现文件上传实例代码(无需插件)
Nov 15 Javascript
使用jquery实现以post打开新窗口
Mar 19 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
Express的路由详解
Dec 10 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
May 15 Javascript
AngularJS 入门教程之事件处理器详解
Aug 19 Javascript
js数字计算 误差问题的快速解决方法
Feb 28 Javascript
JavaScript仿京东秒杀倒计时
Mar 17 Javascript
vue.js实现双击放大预览功能
Jun 23 Javascript
解决vue组件销毁之后计时器继续执行的问题
Jul 21 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 #Javascript
javascript下拉列表中显示树形菜单的实现方法
Nov 17 #Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 #Javascript
jquery可定制的在线UEditor编辑器
Nov 17 #Javascript
JS实现选项卡实例详解
Nov 17 #Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
Nov 17 #Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 #Javascript
You might like
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
让Firefox支持event对象实现代码
2009/11/07 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
小白谈谈对JS原型链的理解
2016/05/03 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
Python 通过URL打开图片实例详解
2017/06/01 Python
python处理按钮消息的实例详解
2017/07/11 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
Python检测网络延迟的代码
2018/05/15 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Pytorch之contiguous的用法
2019/12/31 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
新大陆软件面试题
2016/11/24 面试题
LINUX下线程,GDI类的解释
2012/04/17 面试题
公司活动邀请函
2014/01/24 职场文书
大专学生求职信
2014/07/04 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python