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. Go语言之父谈Go:大道至简

    http://www.csdn.net/article/2012-07-05/2807113-less-is-exponentially-more 摘要:导读:这篇文章是Google首席工程师.Go语 ...

  2. AutoLayout 根据文字、图片自动计算 UITableViewCell 高度

    原文网址: http://lvwenhan.com/ios/449.html 此系列文章代码仓库在 https://github.com/johnlui/AutoLayout ,有不明白的地方可以参考 ...

  3. Mybatis思

    站在巨人的肩膀上,感谢! mybatis源码分析之Mapper代理实现分析 2017年11月21日 23:39:04 huangshanchun 阅读数:277    版权声明:欢迎转载,如有不足之处 ...

  4. 基于java开发的在线题库系统tamguo

    简介 探果网(简称tamguo)是基于java开发的在线题库系统,包括 在线访问 后台运营 会员中心 书籍中心 管理员账号:system 密码:123456 因为线上数据和测试数据没有做到隔离,作者已 ...

  5. STP-3-收敛到新的STP拓扑

    事实上,即使拓扑已经稳定,STP也从未停止工作,对每个收到的BPDU,交换机都会重新计算自己对于根桥,RP,DP的选择.在稳定的拓扑中,交换机收到的BPDU不变,因此对这些BPDU的处理会一遍一遍产生 ...

  6. [題解]luogu_P2055假期的宿舍(二分圖最大匹配)

    雖然是裸題但是仍然沒有看出來...... 1.每個人都對應一張床(可以的話),這樣把人和床看成點,對應關係就是邊,跑最大匹配看匹配數量夠不夠即可 2.連邊條件:如果一個學生且不回家,那麼他可以睡自己的 ...

  7. DRF教程1-序列化

    序列化类 要建立web API,要做的第一件事就是对实例进行序列化,比如以json方式显示.我们可以生命序列化,它和django的forms很相似.在app目录下创建serializers.py fr ...

  8. 1-zookeeper基本原理和使用

    1 分布式应用 1.1 分布式系统原理 在一个网络中,每台服务器上各跑一个应用,然后彼此连接起来就组成一套系统.比如提供完成的游戏服务,需要有认证应用,道具应用,积分应用,游戏主应用等,应用并非跑在一 ...

  9. __getitem__,__setitem__,__delitem__

    __getitem__.__setitem__.__delitem__ 总结: __getitem__,__setitem_,__delitem__ : obj[‘属性’]的方式去操作属性时触发的方法 ...

  10. UVA11292(排序贪心)

    笔者休息娱乐. ; int n, m, a; ll solve(int n, int m) { ll ans = ; priority_queue<int, vector<int>, ...