zoukankan      html  css  js  c++  java
  • js验证身份证格式

    (function(){
        
        Validate={
                data:{
                        // 加权因子  
                        Wi : [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ],
                        
                        // 身份证验证位值.10代表X  
                        ValideCode : [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
                     },
                /** 
                 * 身份证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为脚丫校验码所在校验码数组位置 
                 *  
                 */ 
                idCardValidate : function (idCard) {  
                    if (idCard.length == 15) {  
                        return Validate.isValidityBrithBy15IdCard(idCard);  
                    } else if (idCard.length == 18) {  
                        var a_idCard = idCard.split("");// 得到身份证数组  
                        if(Validate.isValidityBrithBy18IdCard(idCard)
                                &&Validate.isTrueValidateCodeBy18IdCard(a_idCard)){  
                            return true;  
                        }else {  
                            return false;  
                        }  
                    } else {  
                        return false;  
                    }  
                },
    
                /** 
                 * 判断身份证号码为18位时最后的验证位是否正确 
                 * @param a_idCard 身份证号码数组 
                 * @return 
                 */ 
                isTrueValidateCodeBy18IdCard : function (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 += Validate.data.Wi[i] * a_idCard[i];// 加权求和  
                    }  
                    valCodePosition = sum % 11;// 得到验证码所位置  
                    if (a_idCard[17] == Validate.data.ValideCode[valCodePosition]) {  
                        return true;  
                    } else {  
                        return false;  
                    }  
                },
                
                /** 
                 * 通过身份证判断是男是女 
                 * @param idCard 15/18位身份证号码  
                 * @return 'female'-女、'male'-男 
                 */ 
                maleOrFemalByIdCard : function (idCard){  
                    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;  
                    }
                },
                
                /** 
                  * 验证18位数身份证号码中的生日是否是有效生日 
                  * @param idCard 18位书身份证字符串 
                  * @return 
                  */ 
                isValidityBrithBy18IdCard : function (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 
                   */ 
                isValidityBrithBy15IdCard : function (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;  
                        }  
                  }
                             
        }
        
    })()
  • 相关阅读:
    [cocos2dx 3.0 + xcode]疑难点记录
    [转]全球付虚拟卡申请流程~
    [转]全球付虚拟卡申请开发者账号的流程~
    [cocos2d-x3.0]Android+NDK+Eclipse环境搭建及编译步骤~
    Torque2D MIT 学习笔记(27) ---- ImageFont的使用以及字体ImageAsset的工具生成
    关于拒绝测试驱动开发(NoTDD)
    工作两年随感
    一个Java应用,三种字体风格(Java, Windows, Mac),真是蛋疼
    看看这蛋疼的Java代码
    Bash实用技巧:同时循环两个列表
  • 原文地址:https://www.cnblogs.com/zoulei/p/3730035.html
Copyright © 2011-2022 走看看