1、描述

用java语言判断身份证号码是否有效,地区码、出身年月、校验码等验证算法

2、源代码

?
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
package test; 
   
   
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.util.Hashtable; 
import java.util.Scanner; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
   
/**
 * 身份证号码的格式:610821-20061222-612-X
 * 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,
 * 第18位为校验码。检验码分别是0-10共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“X”表示。虽然校验码为“X”不能更换,但若需全用数字表示,只需将18位公民身份号码转换成15位居民身份证号码,去掉第7至8位和最后1位3个数码。 
 * 当今的身份证号码有15位和18位之分。1985年我国实行居民身份证制度,当时签发的身份证号码是15位的,1999年签发的身份证由于年份的扩展(由两位变为四位)和末尾加了效验码,就成了18位。
 * (1)前1、2位数字表示:所在省份的代码; 
 * (2)第3、4位数字表示:所在城市的代码;
 * (3)第5、6位数字表示:所在区县的代码;
 * (4)第7~14位数字表示:出生年、月、日;
 * (5)第15、16位数字表示:所在地的派出所的代码; 
 * (6)第17位数字表示性别:奇数表示男性,偶数表示女性
 * (7)第18位数字是校检码:根据一定算法生成
 * @author tong
 *
 */ 
   
public class ExcelCreateUserAction { 
       
       
    public static String IDCardValidate(String IDStr) throws ParseException {         
        String tipInfo = "该身份证有效!";// 记录错误信息 
        String Ai = ""
        // 判断号码的长度 15位或18位 
        if (IDStr.length() != 15 && IDStr.length() != 18) { 
            tipInfo = "身份证号码长度应该为15位或18位。"
            return tipInfo; 
        
           
   
        // 18位身份证前17位位数字,如果是15位的身份证则所有号码都为数字 
        if (IDStr.length() == 18) { 
            Ai = IDStr.substring(0, 17); 
        } else if (IDStr.length() == 15) { 
            Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15); 
        
        if (isNumeric(Ai) == false) { 
            tipInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。"
            return tipInfo; 
        
           
   
        // 判断出生年月是否有效  
        String strYear = Ai.substring(6, 10);// 年份 
        String strMonth = Ai.substring(10, 12);// 月份 
        String strDay = Ai.substring(12, 14);// 日期 
        if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) { 
            tipInfo = "身份证出生日期无效。"
            return tipInfo; 
        
        GregorianCalendar gc = new GregorianCalendar(); 
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd"); 
        try
            if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150 
                    || (gc.getTime().getTime() - s.parse( 
                            strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) { 
                tipInfo = "身份证生日不在有效范围。"
                return tipInfo; 
            
        } catch (NumberFormatException e) { 
            e.printStackTrace(); 
        } catch (java.text.ParseException e) { 
            e.printStackTrace(); 
        
        if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) { 
            tipInfo = "身份证月份无效"
            return tipInfo; 
        
        if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) { 
            tipInfo = "身份证日期无效"
            return tipInfo; 
        
           
   
        // 判断地区码是否有效  
        Hashtable areacode = GetAreaCode(); 
        //如果身份证前两位的地区码不在Hashtable,则地区码有误 
        if (areacode.get(Ai.substring(0, 2)) == null) { 
            tipInfo = "身份证地区编码错误。"
            return tipInfo; 
        
           
        if(isVarifyCode(Ai,IDStr)==false){ 
            tipInfo = "身份证校验码无效,不是合法的身份证号码"
            return tipInfo; 
        
          
           
        return tipInfo; 
    
       
       
     /*
      * 判断第18位校验码是否正确
     * 第18位校验码的计算方式: 
          1. 对前17位数字本体码加权求和 
          公式为:S = Sum(Ai * Wi), i = 0, ... , 16 
          其中Ai表示第i个位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 
          2. 用11对计算结果取模 
          Y = mod(S, 11) 
          3. 根据模的值得到对应的校验码 
          对应关系为: 
           Y值:     0  1  2  3  4  5  6  7  8  9  10 
          校验码: 1  0  X  9  8  7  6  5  4  3   2
     */ 
    private static boolean isVarifyCode(String Ai,String IDStr) { 
         String[] VarifyCode = { "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" }; 
         int sum = 0; 
         for (int i = 0; i < 17; i++) { 
            sum = sum + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]); 
         
         int modValue = sum % 11; 
         String strVerifyCode = VarifyCode[modValue]; 
         Ai = Ai + strVerifyCode; 
         if (IDStr.length() == 18) { 
             if (Ai.equals(IDStr) == false) { 
                 return false; 
                   
             
         }  
         return true; 
    
       
   
    /**
     * 将所有地址编码保存在一个Hashtable中    
     * @return Hashtable 对象
     */ 
      
    private static Hashtable GetAreaCode() { 
        Hashtable hashtable = new Hashtable(); 
        hashtable.put("11", "北京"); 
        hashtable.put("12", "天津"); 
        hashtable.put("13", "河北"); 
        hashtable.put("14", "山西"); 
        hashtable.put("15", "内蒙古"); 
        hashtable.put("21", "辽宁"); 
        hashtable.put("22", "吉林"); 
        hashtable.put("23", "黑龙江"); 
        hashtable.put("31", "上海"); 
        hashtable.put("32", "江苏"); 
        hashtable.put("33", "浙江"); 
        hashtable.put("34", "安徽"); 
        hashtable.put("35", "福建"); 
        hashtable.put("36", "江西"); 
        hashtable.put("37", "山东"); 
        hashtable.put("41", "河南"); 
        hashtable.put("42", "湖北"); 
        hashtable.put("43", "湖南"); 
        hashtable.put("44", "广东"); 
        hashtable.put("45", "广西"); 
        hashtable.put("46", "海南"); 
        hashtable.put("50", "重庆"); 
        hashtable.put("51", "四川"); 
        hashtable.put("52", "贵州"); 
        hashtable.put("53", "云南"); 
        hashtable.put("54", "西藏"); 
        hashtable.put("61", "陕西"); 
        hashtable.put("62", "甘肃"); 
        hashtable.put("63", "青海"); 
        hashtable.put("64", "宁夏"); 
        hashtable.put("65", "新疆"); 
        hashtable.put("71", "台湾"); 
        hashtable.put("81", "香港"); 
        hashtable.put("82", "澳门"); 
        hashtable.put("91", "国外"); 
        return hashtable; 
    
   
    /**
     * 判断字符串是否为数字,0-9重复0次或者多次   
     * @param strnum
     * @return
     */ 
    private static boolean isNumeric(String strnum) { 
        Pattern pattern = Pattern.compile("[0-9]*"); 
        Matcher isNum = pattern.matcher(strnum); 
        if (isNum.matches()) { 
            return true; 
        } else { 
            return false; 
        
    
   
    /**
     * 功能:判断字符串出生日期是否符合正则表达式:包括年月日,闰年、平年和每月31天、30天和闰月的28天或者29天
     
     * @param string
     * @return
     */ 
    public static boolean isDate(String strDate) { 
       
        Pattern pattern = Pattern 
                .compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$"); 
        Matcher m = pattern.matcher(strDate); 
        if (m.matches()) { 
            return true
        } else
            return false
        
    
       
    public static void main(String[] args) throws ParseException { 
         
        //String IdCard="61082120061222612X"; 
        //从控制端输入用户身份证 
        Scanner s=new Scanner(System.in); 
        System.out.println("请输入你的身份证号码:"); 
        String IdCard=new String(s.next()); 
        //将身份证最后一位的x转换为大写,便于统一 
        IdCard = IdCard.toUpperCase(); 
        System.out.println(IDCardValidate(IdCard)); 
    
       
       
   
}

Java判断身份证号码相关推荐

  1. Java判断身份证号码是否正确

    方法如下: public static final int IDENTITYCODE_OLD = 15; // 老身份证15位public static final int IDENTITYCODE_ ...

  2. java验证身份证号码是否有效源代码

    转载自   java验证身份证号码是否有效源代码 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 package test; import java.t ...

  3. java根据身份证号码得到生日和性别

    java根据身份证号码得到生日和性别 IDCards工具类 执行结果 IDCards工具类 package com.liantuo.finance.utils;//身份证工具类 public clas ...

  4. 判断身份证号码的正确性源码

    判断身份证号码的正确性源码 根据[中华人民共和国国家标准   GB   11643-1999]中有关公民身份号码的规定,      '公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成. ...

  5. JS准确判断身份证号码

    JS准确判断身份证号码 附带示意图 以及使用方法 //校验年月日专用isDate8(sDate) {if (!/^[0-9]{8}$/.test(sDate)) {return false;}var ...

  6. JAVA识别身份证号码,H5识别身份证号码,tesseract-ocr识别(二)

    背景介绍 上一篇博文介绍了如何使用JAVA识别身份证号码,假设在截取了身份证号码信息的情况下,这一篇博文主要讨论一下思路吧,技术方面都是大家会的. 思路分析 H5拍照上传 -> 服务端截取身份证 ...

  7. iOS判断身份证号码是否正确

    ①根据百度百科中身份证号码的标准实现该方法 ②该方法只能判断18位身份证,且不能判断身份证号码和姓名是否对应(要看姓名和号码是否对应,应该有大量的数据库做对比才能实现) ③直接copy这段代码,就能通 ...

  8. JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别

    我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了 import java.text.SimpleDateFormat; import java.util.Da ...

  9. Java验证身份证号码及提取生日信息

    Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息.第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正 ...

最新文章

  1. 17.4.28 清北第一天水题
  2. 在Ubuntu中自动运行KMS服务
  3. OpenCL异构扩展
  4. 深度学习框架TensorFlow(4.Fetch and Feed)
  5. context元素大概解说
  6. 虚幻四中怎么保持导入模型坐标_「虚幻引擎5」为何让开发者们拍手叫好?它到底厉害在哪?...
  7. 2010年篮球规则(FIBA)
  8. AutoCAD批量提取坐标点的三种方法
  9. 跳出坑爹的 Runtime Library 坑
  10. Kali下TheFatRat工具的安装教程
  11. Roslyn 静态分析
  12. 云计算认证系列:CKA认证
  13. 毕业设计总结篇之终结篇——基于android的创意展示平台(混合app)
  14. 移动通信网络架构的演进
  15. Ansys/Abaqus/nbsp;热应力分析.20…
  16. html5+JS制作音乐播放器
  17. 经典共识PoW的原理及实现
  18. 《网络攻防》 免杀原理与实践
  19. Nova Battles是2022年值得关注的链游
  20. 春季高考计算机基础知识试题答案,春季高考数学真题

热门文章

  1. python主成分分析各变量重要性_主成分分析的理解
  2. 用 js判断 一个数是否是素数(质数)_小学五年级下册数学公式打印版,孩子考试用的上!...
  3. 软考中级哪个通过率高且简单?
  4. “数字云徽章”亮相东京奥运会
  5. python爬取51job网
  6. hey,开通个人公众号啦!
  7. 小白进阶之文档快速比较功能 --- 比较两个文档并标记
  8. 计算机应用期刊查重嘛,关于期刊投稿,你所碰到的几件事
  9. Okio—— 更加高效易用的IO库,太完整了
  10. 攻克苹果2.1被拒问题 韩俊强的博客