码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-06-06 14:47:42      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息。第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正题。
问题说明:目前,我国大部分地区都使用的是第二代身份证,第二代身份证号码的位数为18位。但公安部没有下发统一的关于停用第一代身份证的文件,第一代身份证中有15位和18位身份证号的混用。
15位身份证号码:排列顺序从左至右依次为:6位数字地址码,6位数字出生日期码,3位数字顺序码,其中出生日期码不包含世纪数。
18位身份证号码:公民身份号码是特征组合码,由17位数字码和1位校验码组成。排列顺序从左至右依次为:6位数字地址码,8位数字出生日期码,3位数字顺序码和1位数字校验码。
【地址码】:表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
前两位代码表示省、自治区、直辖市、特别行政区:
——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:"国外"
中间两位代码表示市、地区、自治州、盟、直辖市所辖市辖区、县汇总码、省(自治区)直辖县级行政区划汇总码,其中:
——01~20、51~70表示市,01、02还用于表示直辖市所辖市辖区、县汇总码;
——21~50表示地区、自治州、盟;
——90表示省(自治区)直辖县级行政区划汇总码。
最后两位表示县、自治县、县级市、旗、自治旗、市辖区、林区、特区,其中:
——01~20表示市辖区、地区(自治州、盟)辖县级市、市辖特区以及省(自治区)直辖县级行政区划中的县级市,01通常表示辖区汇总码;
——21~80表示县、自治县、旗、自治旗、林区、地区辖特区;
——81~99表示省(自治区)辖县级市。
【出生日期码】:表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
【随机码】:生日编码之后的两位为随机生成数。
【顺序码】:顺序码的奇数分给男性,偶数分给女性。
【校验码】:是根据前面十七位数字码计算出来的,计算方法如下:

      Index =  ∑(a[i]*W[i]) mod 11 ( i = 0, 1, ..., 16 )

              a[i]: 表示身份证号码第 i 位上的数字值

      W[i]: 表示第 i 位上的加权因子 ,W={7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2}。

             身份证号码的校验码 = R[Index],R={1 0 X 9 8 7 6 5 4 3 2}。

      由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证号码中可能含有非数字的字母X。

思路分析: 针对给出的身份证组成信息验证身份证号是否合法。1. 验证身份证号是否是15位或者18位;2. 验证身份证号是否都是由数字组成;3. 验证身份证号的前两位是否属于行政区化代码中;4.验证身份证号的生日信息是否正确;5.对于18位的身份证号,验证校验码是否正确。

参考博客:http://www.cnblogs.com/tenking/archive/2009/12/07 /2075290.html;

http://love3400wind.blog.163.com/blog/static /7963080120095862446850/

bubuko.com,布布扣
  1 package idcard;
  2 
  3 import java.util.Calendar;
  4 import java.util.Date;
  5 
  6 public class isLegalToIDNumber {
  7     
  8     public static void main(String[] args) {
  9         // TODO Auto-generated method stub
 10         String[] strIDNumberArr = {"53010119810602001x","330521197411044030","53010119810602007x"};
 11         for (int i = 0; i < strIDNumberArr.length; ++i){
 12             if (isLegal(strIDNumberArr[i])){
 13                 System.out.println(strIDNumberArr[i] + "为正确的身份证号。");
 14                 displayBirthDate(strIDNumberArr[i]);
 15             }
 16             else{
 17                 System.out.println(strIDNumberArr[i] + "为错误身份证号。");
 18             }
 19         }
 20     }
 21     
 22     public static boolean isLegal(String strID){
 23         boolean flag = true;
 24         //判断输入的字符串是否为空
 25         if ((strID == null) || (strID.length() <= 0) || strID.equals("")){
 26             flag = false;
 27         }
 28         //判断输入的字符串长度是否为15或者18
 29         if (strID.length() != 15 && strID.length() != 18){
 30             flag = false;
 31         }
 32         //判断输入的字符串是否都为数字
 33         if (!isDigit(strID)){
 34             flag = false;
 35         }
 36         //判断身份证号的前两位是否正确
 37         if (!isCorrectFirstTwo(strID.substring(0,2))){
 38             flag = false;
 39         }
 40         //验证生日是否正确
 41         String strBirthDay = "";
 42         if (strID.length() == 15){
 43             strBirthDay = "19" + strID.substring(6,12);
 44         }
 45         else{
 46             strBirthDay = strID.substring(6,14);
 47         }
 48         if (!isCorrectBirthDay(strBirthDay)){
 49             flag = false;
 50         }
 51         //验证18位身份证号的校验码是否正确
 52         if (strID.length() == 18){
 53             if (!isCheckCode(strID)){
 54                 flag = false;
 55             }
 56         }        
 57         return flag;
 58     }
 59     
 60     public static void displayBirthDate(String strID){
 61         String strYear = "";
 62         String strMonth = "";
 63         String strDay = "";
 64         
 65         if (strID.length() == 15){
 66             strYear = "19" + strID.substring(6,8);
 67             strMonth = strID.substring(8,10);
 68             strDay = strID.substring(10,12);
 69         }
 70         
 71         if (strID.length() == 18){
 72             strYear = strID.substring(6,10);
 73             strMonth = strID.substring(10,12);
 74             strDay = strID.substring(12,14);
 75         }
 76         
 77         System.out.println("生日日期为:" + strYear + "年" + strMonth + "月" + strDay + "日");
 78     }
 79 
 80     public static boolean isCheckCode(String strID){
 81          // 每位加权因子   
 82         final int arrWeight[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };   
 83          // 第18位校检码   
 84         final String strArrCheckCode[] = { "1", "0", "X", "9", "8", "7", "6", "5",   
 85                 "4", "3", "2" };
 86         //将身份证号前17位存入数组,进行下一步计算
 87         int[] arrID = new int[17];
 88         for (int i = 0; i < 17; ++i){
 89             arrID[i] = Integer.parseInt(strID.substring(i, i + 1));
 90         }
 91         int nSum = 0;
 92         for (int i = 0; i < 17; ++i){
 93             nSum += arrID[i] * arrWeight[i];
 94         }
 95         int nIdx = nSum % 11;
 96         String strLast = strID.substring(17);
 97         if (strArrCheckCode[nIdx].equals(strLast)){
 98             return true;
 99         }
100         else{
101             return false;
102         }
103     }
104     
105     public static boolean isCorrectBirthDay(String strDate){
106         int nYear = Integer.parseInt(strDate.substring(0, 4));
107         int nMonth = Integer.parseInt(strDate.substring(4, 6));
108         int nDay = Integer.parseInt(strDate.substring(6, 8));
109         //获取系统当前的日期,判断是否在当前日期之前
110         Date curDate = new Date();
111         Calendar cal = Calendar.getInstance();
112         cal.setTime(curDate);
113         if (nYear > cal.get(Calendar.YEAR)){
114             return false;
115         }
116         //判断是否为合法月份
117         if (nMonth < 1 || nMonth > 12){
118             return false;
119         }
120         //判断是否为合法日期
121         boolean bFlag = false;
122         switch(nMonth){
123         case 1:
124         case 3:
125         case 5:
126         case 7:
127         case 8:
128         case 10:
129         case 12:
130             if (nDay >= 1 && nDay <= 31){
131                 bFlag = true;
132             }
133             break;
134         case 2:
135             if ((((nYear % 4 == 0) && (nYear % 100 != 0))|| (nYear % 400 == 0))){
136                 if (nDay >=1 && nDay <= 29){
137                     bFlag = true;
138                 }
139             }
140             else{
141                 if (nDay >=1 && nDay <= 28){
142                     bFlag = true;
143                 }
144             }
145             break;
146         case 4:
147         case 6:
148         case 9:
149         case 11:
150             if (nDay >= 1 && nDay <= 30){
151                 bFlag = true;
152             }
153             break;
154         }
155         if (!bFlag){
156             return false;
157         }
158         return true;
159     }
160     
161     public static boolean isCorrectFirstTwo(String strID12){
162         final String strArrCityCode[] = { "11", "12", "13", "14", "15", "21", "22",   
163                 "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43",   
164                 "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63",   
165                 "64", "65", "71", "81", "82", "91" };
166         boolean bFlag = false;
167         for (String strIdx : strArrCityCode){
168             if (strIdx.equalsIgnoreCase(strID12))
169             {
170                 bFlag = true;
171                 break;
172             }
173         }
174         if (bFlag){
175             return true;
176         }
177         return false;
178     }
179     
180     public static boolean isDigit(String strID){
181         int nDigitCnt = 0;
182         int nLength = (strID.length() == 15)? strID.length() : (strID.length() - 1);
183         for (int i = 0; i < nLength; ++i){
184             char cTmp = strID.charAt(i);
185             if (cTmp >= ‘0‘ && cTmp <= ‘9‘){
186                 ++nDigitCnt;
187             }
188         }
189         if (nDigitCnt != nLength){
190             return false;
191         }
192         else{
193             return true;
194         }
195     }
196     
197 
198 }
bubuko.com,布布扣

 

Java验证身份证号码及提取生日信息,布布扣,bubuko.com

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

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/Bunnyxiaochouchou/p/3766642.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!