超精准的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 相关文章推荐
摘自启点的main.js
Apr 20 Javascript
jquery遍历checkbox的注意事项说明
Feb 21 Javascript
在页面中输出当前客户端时间javascript实例代码
Mar 02 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
BootStrap实现带关闭按钮功能
Feb 15 Javascript
vue loadmore 组件滑动加载更多源码解析
Jul 19 Javascript
如何解决js函数防抖、节流出现的问题
Jun 17 Javascript
JS中async/await实现异步调用的方法
Aug 28 Javascript
VUE+elementui面包屑实现动态路由详解
Nov 04 Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 Javascript
原生JS实现汇率转换功能代码实例
May 13 Javascript
关于vue中如何监听数组变化
Apr 28 Vue.js
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单件模式结合命令链模式使用说明
2008/09/07 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
python删除列表内容
2015/08/04 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
大队委竞选演讲稿
2014/04/28 职场文书
银行委托书范本
2014/09/28 职场文书
2016年感恩节活动总结大全
2016/04/01 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python
MySQL一些常用高级SQL语句
2021/07/03 MySQL
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL