超精准的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修改css样式style动态改变元素样式
Dec 16 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
Mar 12 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
May 08 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
Jan 05 Javascript
node.js操作mysql(增删改查)
Jul 24 Javascript
Web 开发中Ajax的Session 超时处理方法
Jan 19 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
Jan 20 Javascript
Bootstrap table表格简单操作
Feb 07 Javascript
JS利用cookies设置每隔24小时弹出框
Apr 20 Javascript
使用Vue写一个datepicker的示例
Jan 27 Javascript
详解各版本React路由的跳转的方法
May 10 Javascript
Vue实现开关按钮拖拽效果
Sep 22 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编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
用python登录Dr.com思路以及代码分享
2014/06/25 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
浅谈Python的异常处理
2016/06/19 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
八项规定整改方案
2014/02/21 职场文书
启动仪式策划方案
2014/06/14 职场文书
2016年春节问候语
2015/11/11 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电