身份证号正则校验(js校验+JAVA校验)

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]; 
    
 
 
}

  

posted @ 2015-07-25 15:42  java高级技术汇  阅读(508)  评论(0编辑  收藏  举报