超精准的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 相关文章推荐
js AspxButton的客户端操作
Jun 26 Javascript
jQuery 判断页面元素是否存在的代码
Aug 14 Javascript
namespace.js Javascript的命名空间库
Oct 11 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
Mar 14 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
Aug 14 Javascript
js验证是否为数字的总结
Apr 14 Javascript
jQuery 中$(this).index与$.each的使用指南
Nov 20 Javascript
jQuery实现伪分页的方法分享
Feb 17 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
Mar 03 Javascript
VUE组件中的 Drawer 抽屉实现代码
Aug 06 Javascript
vue组件命名和props命名代码详解
Sep 01 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
杏林同学录(五)
2006/10/09 PHP
php流量统计功能的实现代码
2012/09/29 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
Javascript中的数学函数
2007/04/04 Javascript
Aptana调试javascript图解教程
2009/11/30 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
详解JS面向对象编程
2016/01/24 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
vue组件间的参数传递实例详解
2019/04/26 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
python正则表达式match和search用法实例
2015/03/26 Python
Python切片工具pillow用法示例
2018/03/30 Python
python版飞机大战代码分享
2018/11/20 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
Python的高阶函数用法实例分析
2019/04/11 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
房地产销售计划书
2014/01/10 职场文书
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
golang 比较浮点数的大小方式
2021/05/02 Golang
MySQL中in和exists区别详解
2021/06/03 MySQL
mysql事务隔离级别详情
2021/10/24 MySQL