超精准的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比较文档位置
Apr 08 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
fancybox modal的完美解决(右上的X)
Oct 30 Javascript
JavaScript语言对Unicode字符集的支持详解
Dec 30 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
May 30 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
Aug 05 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
JS基于正则表达式实现的密码强度验证功能示例
Sep 21 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
iview在vue-cli3如何按需加载的方法
Oct 31 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
Mar 08 Javascript
用JS实现飞机大战小游戏
Jun 09 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
PHP新手上路(十二)
2006/10/09 PHP
PHP生成静态页面详解
2006/12/05 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
jQuery代码优化 事件委托篇
2011/11/01 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
最大K个数问题的Python版解法总结
2016/06/16 Python
用Python解决x的n次方问题
2019/02/08 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
Python timeit模块的使用实践
2020/01/13 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Python request中文乱码问题解决方案
2020/09/17 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
JPA的优势都有哪些
2013/07/04 面试题
企业申诉管理制度
2014/01/30 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
golang的文件创建及读写操作
2022/04/14 Golang