js实现身份证号码验证的简单实例


Posted in Javascript onFebruary 19, 2014

以下是根据身份证号码编码规则,使用JS对其进行有效性验证代码

IdCard-Validate.js代码如下:

/**
 * 身份证15位编码规则:dddddd yymmdd xx p 
 * dddddd:地区码 
 * yymmdd: 出生年月日 
 * xx: 顺序类编码,无法确定 
 * p: 性别,奇数为男,偶数为女
 * <p />
 * 身份证18位编码规则:dddddd yyyymmdd xxx y 
 * dddddd:地区码 
 * yyyymmdd: 出生年月日 
 * xxx:顺序类编码,无法确定,奇数为男,偶数为女 
 * y: 校验码,该位数值可通过前17位计算获得
 * <p />
 * 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);
 } else if (idCard.length == 18) {
  var a_idCard = idCard.split("");// 得到身份证数组
  if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){
   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;
 }
}
/**
 * 通过身份证判断是男是女
 * @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;
 }
// 可对传入字符直接当作数组来处理
// if(idCard.length==15){
// alert(idCard[13]);
// if(idCard[13]%2==0){
// return 'female';
// }else{
// return 'male';
// }
// }else if(idCard.length==18){
// alert(idCard[16]);
// if(idCard[16]%2==0){
// return 'female';
// }else{
// return 'male';
// }
// }else{
// return null;
// }
}
 /**
  * 验证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, "");
}

对于上述代码中,关于性别的判断在实际使用中,可加入首先判断身份证是否有效。在本代码示例中并未进行该种判断,有点鸡肋的感觉,可在实际使用中根据情况进行丰满。
Javascript 相关文章推荐
Mozilla 表达式 __noSuchMethod__
Apr 05 Javascript
js中将字符串转换成json的三种方式
Jan 12 Javascript
优化Node.js Web应用运行速度的10个技巧
Sep 03 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
Apr 07 Javascript
JavaScript基础教程——入门必看篇
May 20 Javascript
JavaScript必知必会(十) call apply bind的用法说明
Jun 08 Javascript
深入理解requestAnimationFrame的动画循环
Sep 20 Javascript
微信小程序 视图容器组件的详解及实例代码
Jan 19 Javascript
详解vue.js移动端导航navigationbar的封装
Jul 05 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
Aug 27 Javascript
vue中的使用token的方法示例
Mar 10 Javascript
vue 使用post/get 下载导出文件操作
Aug 07 Javascript
js实现表格字段排序
Feb 19 #Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 #Javascript
jQuery 文本框得失焦点的简单实例
Feb 19 #Javascript
JS实现仿百度输入框自动匹配功能的示例代码
Feb 19 #Javascript
js 数值转换为3位逗号分隔的示例代码
Feb 19 #Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
Feb 19 #Javascript
JS执行删除前的判断代码
Feb 18 #Javascript
You might like
php&amp;java(一)
2006/10/09 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
Python验证码识别处理实例
2015/12/28 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
Django ORM filter() 的运用详解
2020/05/14 Python
keras导入weights方式
2020/06/12 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
Python函数调用追踪实现代码
2020/11/27 Python
简单的HTML5初步入门教程
2015/09/29 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
曼城官方网上商店:Manchester City
2019/09/10 全球购物
技校个人求职信范文
2014/01/25 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
网络管理专业求职信
2014/03/15 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
八月一日观后感
2015/06/10 职场文书
python 破解加密zip文件的密码
2021/04/22 Python
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android