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. Unity UGUI鼠标穿透UI问题(Unity官方的解决方法)

    简述 最近在用UGUI的时候遇到了鼠标穿透的问题,就是说在UGUI和3D场景混合的情况下,点击UI区域同时也会 触发3D中物体的鼠标事件.比如下图中 这里给Cube加了一个鼠标点击改变颜色的代码,如下 ...

  2. Unity 2D骨骼动画2:创建真实动画

    http://bbs.9ria.com/thread-401781-1-1.html 在这个系列,我们将关注Unity引擎提供的基于骨骼动画工具.它的主要思想是为了把它应用到你自己的游戏来介绍和教基本 ...

  3. C\C++书籍

    原文链接: bert hubert   翻译: 伯乐在线- 周昌鸿译文链接: http://blog.jobbole.com/61308/ 人们常常问我有什么C++和编程的书籍推荐,也许是因为我在Po ...

  4. Mysql 到 Hbase 数据如何实时同步,强大的 Streamsets 告诉你

    很多情况大数据集群需要获取业务数据,用于分析.通常有两种方式: 业务直接或间接写入的方式 业务的关系型数据库同步到大数据集群的方式 第一种可以是在业务中编写代码,将觉得需要发送的数据发送到消息队列,最 ...

  5. jar工具的使用

  6. StringUtils.split()和string.split()的区别

    场景 出于业务考虑,将多个字符串拼接起来时,使用的分隔符是;,;.如果要将这样一个拼接来的字符串分割成原本的多个字符串时,就需要使用到jdk自带的split()方法.不过因为公司的编程规范,改为使用了 ...

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

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

  8. C#连接Oracle中文乱码问题解决方法

    1.打开注册表:开始-运行-regedit       HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb11g_home1/OLEDB    在右侧点鼠标右键- ...

  9. 图像分类丨ILSVRC历届冠军网络「从AlexNet到SENet」

    前言 深度卷积网络极大地推进深度学习各领域的发展,ILSVRC作为最具影响力的竞赛功不可没,促使了许多经典工作.我梳理了ILSVRC分类任务的各届冠军和亚军网络,简单介绍了它们的核心思想.网络架构及其 ...

  10. php pack、unpack、ord 函数使用方法(二进制流接口应用实例)

    在工作中,我也逐渐了解到pack,unpack,ord对于二进制字节处理的强大. 下面我逐一介绍它们.在我们工作中,用到它们的估计不多. 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php ...