js校验身份证号【15位和18位】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
[javascript] view plaincopyprint?
function scCard(){ 
    var scType=document.getElementById("sc_card_type").value; 
    if(scType=="1"){ 
     var scCard=document.getElementById("sc_card_num").value; 
                      if(scCard.length!=0){ 
                       if(!checkCard(scCard)){ 
                        $("#errorTips").html("身份证号码格式错误"); 
                       }else
                        $("#errorTips").html(""); 
                       
                      
    
    return false
       
   
   //function checkidno(obj) { 
         
      var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古"
             21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏"
             33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南"
             42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆"
             51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃"
             63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外" 
            }; 
    
   checkCard = function(obj) 
    
        //var card = document.getElementById('card_no').value; 
        //是否为空 
       // if(card === '') 
       // { 
               
      //     return false; 
        //} 
        //校验长度,类型 
        if(isCardNo(obj) === false
        
               
           return false
        
        //检查省份 
        if(checkProvince(obj) === false
        
               
           return false
        
        //校验生日 
        if(checkBirthday(obj) === false
        
               
           return false
        
        //检验位的检测 
        if(checkParity(obj) === false
        
               
           return false
        
        return true
    }; 
       
       
    //检查号码是否符合规范,包括长度,类型 
    isCardNo = function(obj) 
    
        //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X 
        var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/; 
        if(reg.test(obj) === false
        
            return false
        
       
        return true
    }; 
       
    //取身份证前两位,校验省份 
    checkProvince = function(obj) 
    
        var province = obj.substr(0,2); 
        if(vcity[province] == undefined) 
        
            return false
        
        return true
    }; 
       
    //检查生日是否正确 
    checkBirthday = function(obj) 
    
        var len = obj.length; 
        //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字 
        if(len == '15'
        
            var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;  
           var arr_data = obj.match(re_fifteen); 
            var year = arr_data[2]; 
            var month = arr_data[3]; 
            var day = arr_data[4]; 
            var birthday = new Date('19'+year+'/'+month+'/'+day); 
            return verifyBirthday('19'+year,month,day,birthday); 
        
        //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X 
        if(len == '18'
        
            var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/; 
            var arr_data = obj.match(re_eighteen); 
            var year = arr_data[2]; 
            var month = arr_data[3]; 
            var day = arr_data[4]; 
            var birthday = new Date(year+'/'+month+'/'+day); 
            return verifyBirthday(year,month,day,birthday); 
        
        return false
    }; 
       
    //校验日期 
    verifyBirthday = function(year,month,day,birthday) 
    
        var now = new Date(); 
        var now_year = now.getFullYear(); 
        //年月日是否合理 
        if(birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day) 
        
            //判断年份的范围(3岁到100岁之间) 
            var time = now_year - year; 
            if(time >= 0 && time <= 130
            
                return true
            
            return false
        
        return false
    }; 
       
    //校验位的检测 
    checkParity = function(obj) 
    
        //15位转18位 
        obj = changeFivteenToEighteen(obj); 
        var len = obj.length; 
        if(len == '18'
        
            var arrInt = new Array(7910584216379105842); 
            var arrCh = new Array('1''0''X''9''8''7''6''5''4''3''2'); 
            var cardTemp = 0, i, valnum;  
           for(i = 0; i < 17; i ++)  
           {  
               cardTemp += obj.substr(i, 1) * arrInt[i];  
           }  
           valnum = arrCh[cardTemp % 11];  
           if (valnum == obj.substr(171))  
           
                return true
            
            return false
        
        return false
    }; 
       
    //15位转18位身份证号 
    changeFivteenToEighteen = function(obj) 
    
        if(obj.length == '15'
        
            var arrInt = new Array(7910584216379105842); 
            var arrCh = new Array('1''0''X''9''8''7''6''5''4''3''2'); 
            var cardTemp = 0, i;    
           obj = obj.substr(06) + '19' + obj.substr(6, obj.length - 6); 
            for(i = 0; i < 17; i ++)  
           {  
               cardTemp += obj.substr(i, 1) * arrInt[i];  
           }  
           obj += arrCh[cardTemp % 11];  
           return obj; 
        
        return obj; 
    };

JAVA校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.ebiz.base.utils;
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import com.ebiz.base.consts.BaseConst;
import com.ebiz.base.consts.ConfigConst;
import com.ebiz.base.consts.ExceptionConst;
import com.ebiz.framework.util.date.DateUtil;
import com.ebiz.framework.util.date.DateValidate;
import com.ebiz.framework.util.validate.ValidateUtil;
import com.ebiz.persistence.laputa.FndPageRule;
import com.hp.hpl.sparta.ParseException;
 
public class CheckIdentificationUtil {
    public static void main(String[] args)  {
         
        System.out.println(idCardValidate("370802940221002"));
 
    }
     
    /**功能 18位 身份证的校验
     * @param idStr
     * @return   ParseException   1001
     * @throws Exception
     * @throws ParseException
     * @throws NumberFormatException
     * @throws java.text.ParseException
     * @author wangming
     */
    public static  String idCardValidate(String idStr)    {
         
        if (idStr == null || (  idStr.length() != 15 && idStr.length() != 18  )) {
            return BaseConst.PUBLIC_RESPONSE_FAIL;
        }
        if(  idStr.length() == 15 ){ 
            StringBuilder sb = new StringBuilder(); 
            sb.append(idStr.substring(06)) 
              .append("19"
              .append(idStr.substring(6)); 
            try {
                sb.append(getVerifyCode(sb.toString()));
                idStr = sb.toString();
            catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            
           System.out.println(sb);
        }
     
        String errorInfo = "";// 记录错误信息
        //取模映射
        String[] valCodeArr = { "1""0""X""9""8""7""6""5""4","3""2" };
        //加权
        String[] wi = { "7""9""10""5""8""4""2""1""6""3""7","9""10""5""8""4""2" };
        String ai =idStr.substring(017);
        if (ValidateUtil.isDigit(ai) == false) {
            errorInfo = ExceptionConst.PAXINFO_CARD_ISNOTNUM;
            return errorInfo;
        }
        // ================ 出生年月是否有效 ================
        String strYear = ai.substring(610);// 年份
        String strMonth = ai.substring(1012);// 月份
        String strDay = ai.substring(1214);// 月份
        if (DateValidate.isStrDate(ai.substring(6,14))== false) {
            errorInfo = ExceptionConst.PAXINFO_CARD_BIRTHDAY_OVER;
                    //"身份证生日无效。";
            return errorInfo;
        }
        GregorianCalendar gc = new GregorianCalendar();
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
        Date limitDate=DateUtil.getIntervalDate(new Date(),DateUtil.BEFORE, "150Y");
        Date dd = null;
        try {
            dd = s.parse(strYear + "-" + strMonth + "-" + strDay);
        catch (java.text.ParseException e) {//类型转换异常
            errorInfo = "ParseException";
            return errorInfo;
        }
        if (DateValidate.isDateBefore(dd,limitDate)) {
            errorInfo = ExceptionConst.PAXINFO_CARD_BIRTHDAY_OVER;
                    //"身份证生日不在有效范围。";
            return errorInfo;
        }
 
        // ================ 地区码是否有效 ================
         
        if (ConfigConst.CARD_AREA_CODE.indexOf(ai.substring(02))<0) {
            errorInfo = ExceptionConst.PAXINFO_CARD_AREA_OVER;
                    //"身份证地区编码错误";
            return errorInfo;
        }
        // ================ 判断最后一位的值是否符合校验规则 ================
        int totalmulAiWi = 0;
        for (int i = 0; i < 17; i++) {
            totalmulAiWi = totalmulAiWi+ Integer.parseInt(String.valueOf(ai.charAt(i)))* Integer.parseInt(wi[i]);
        }
        int modValue = totalmulAiWi % 11;
        //映射
        String strVerifyCode = valCodeArr[modValue];
        ai = ai + strVerifyCode;
        //x的校验忽略末尾的大小写
        if (ai.equalsIgnoreCase(idStr) == false) {
                errorInfo = ExceptionConst.PAXINFO_CARD_LAST_OVER;
                        //"身份证无效,不是合法的身份证号码";
                return errorInfo;
        }
        return  BaseConst.PUBLIC_RESPONSE_SUCCESS;
    
         
         
 
    /**
     * 将已经加上年份的15位身份证,按照规则由17位推算出第18位
     * @param idCardNumber
     * @return
     */
    public static char getVerifyCode(String idCardNumber) { 
        char[] Ai = idCardNumber.toCharArray(); 
        int[] Wi = {7910584216379105842}; 
        char[] verifyCode = {'1','0''X''9''8''7''6''5''4''3''2'}; 
        int S = 0
        int Y; 
        for(int i = 0; i < Wi.length; i++){ 
            S += (Ai[i] - '0') * Wi[i]; 
        
        Y = S % 11
        return verifyCode[Y]; 
    
 
 
}

  

身份证号正则校验(js校验+JAVA校验)的更多相关文章

  1. 身份证校验,前台js校验,后台java校验

    js校验: var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内 ...

  2. java中身份证号和的银行卡的深度校验

    一: 身份证号: package com.mobile.utils; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...

  3. 微信小程序常用表单校验方法(手机号校验、身份证号(严格和非严格校验、验证码六位数字校验))

    util.js function isPhone(value) { if (!/^1(3|4|5|7|8)\d{9}$/.test(value)) { return false } else { re ...

  4. Java中校验身份证号合法性(真伪),获取出生日期、年龄、性别、籍贯

    开发过程中有用的身份证号的业务场景,那么校验身份证的合法性就很重要了,另外还有通过身份证获取出生日期.年龄.性别.籍贯等信息, 下面是本人在开发中用到的关于校验身份证真伪的工具类,可以直接拿来使用,非 ...

  5. js验证真实姓名与身份证号,手机号

    最近的项目中用的需要调用实名认证的接口,实名认证接口价格相比短信而言高了不是几分钱,所以说调用实名认证的条件就要严格把关,因此用到js验证真实姓名与js验证身份证号. 进入正题 1.js验证真实姓名 ...

  6. javascript实现验证身份证号的有效性并提示

    javascript实现验证身份证号的有效性并提示 function nunber(allowancePersonValue){ if(allowancePersonValue=="身份证号 ...

  7. 最全,可直接用的一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等。

    一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等. // 判断邮箱 isValid = [text isValidEmail]; // 判断手机 ...

  8. JS校验身份证号的合法性

    前端表单中有身份证号的校验,下边是用JS来校验身份证号的合法性. 中国居民身份证号码编码规则 第一.二位表示省(自治区.直辖市.特别行政区). 第三.四位表示市(地级市.自治州.盟及国家直辖市所属市辖 ...

  9. 身份证真实性校验js、mini ui身份证长度正则验证

    身份证号码真实性校验 <input type="text" value="请输入身份证号" id="cards" ><bu ...

随机推荐

  1. BAT或赌在当下或押在未来,谁是王者?

    转自:http://www.tmtpost.com/97132.html 百度阿里和腾讯三家本来的核心业务并不冲突,各守一方阵地,但随着各自的收购注资加上业务的延展而慢慢有了交际,阿里和腾讯在移动支付 ...

  2. java 三大基本特征

    java中的面向对象的三大基本特征是:[封装].[继承].[多态] 封装:对象要有一个明确的边界:边界的划分(对象各司其职.对象的粒度.对象的可重用性) 属性(bean.pojo):私有的privat ...

  3. 最长XX序列问题小结 By cellur925

    今天我们搞一搞几个经典序列问题之间的爱♂恨♂情♂仇. 首先我们看一看LIS(最长上升子序列)(From my onenote)

  4. react-native-wechat微信组件的使用

    对我来说link没有成功过,所以参考了其他人的文章,原文:https://www.jianshu.com/p/6a792118fae4 第一步:要去:https://open.weixin.qq.co ...

  5. PostgreSQL-11-WITH语句

    1.WITH语句原理:通用表表达式(Common Table Expressions)/CTEs,在大型查询中的辅助语句 WITH name_for_summary_data AS ( SELECT ...

  6. Python 杂集

    Python字符串方法 Python递归和迭代 Python判断字符串编码以及编码的转换 exec 和 eval

  7. Codeforces Round #546 (Div. 2) A. Nastya Is Reading a Book

    链接:https://codeforces.com/contest/1136/problem/A 题意: 给n个区间,每个区间范围不超过100,n不超过100. 给一个位置k,1-(k-1)是遍历过的 ...

  8. keil_rtx特点

    Keil RTX是一个专为ARM及Cortex M系列处理器开发的无版税的确定的实时操作系统.它允许工程师建立多任务同步并行的程序软件,同时也能帮助使程序代码更加结构化和便于维护.   产品亮点 所有 ...

  9. [转]Fedora 下安装NVIDIA显卡驱动(使用后无法进入图形界面)

    http://www.linuxidc.com/Linux/2014-04/100689.htm rpmfusion安装法: 相对于ATi,在Linux下安装NVIDIA就简单得多.只需要一个命令即可 ...

  10. 解决java.lang.NoClassDefFoundError: javax/xml/rpc/service错误的方法

    最近在做WebService项目,本地测试没有问题,打算部署到服务器上,但是部署后,访问时出现了如下图1的错误: 图1 图1报的是没有找到定义的类的错误.刷新页面有又出现了另外“新”的错误: 图2 根 ...