输入身份证号,出生年月日、性别、判断其地区

一、首先弄清楚一些东西:

15位的旧身份证,最后一个数是单数的为男,双数的为女

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


二、怎么得到出生地区?

因为身份证前6位代表的是其出生地方,而且都有一一对应的关系,所以直接拿着去比对就可以。

三、代码实现

[java]  view plain copy print ?
  1. package j8;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.FileInputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStreamReader;  
  7. import java.util.Properties;  
  8.   
  9. public class IdCardParser {  
  10.   
  11.     public static void main(String[] args) {  
  12.         try {  
  13.             System.out.println("请输入您要查询的身份证号码:");  
  14.             InputStreamReader reader = new InputStreamReader(System.in);  
  15.             String str = new BufferedReader(reader).readLine();  
  16.             IdCard ic = IdCardParser.parse(str);  
  17.             if(ic != null){  
  18.                 System.out.println(ic);  
  19.             }else{  
  20.                 System.out.println("您输入的有误");  
  21.             }  
  22.               
  23.         } catch (IOException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.   
  28.     private static final byte[] factor = { 7910584216379,  
  29.             1058421 };  
  30.     private static final char[] ch = { '1''0''X''9''8''7''6''5',  
  31.             '4''3''2' };  
  32.   
  33.     /** 
  34.      * 15位身份证转18位身份证.失败返回null 
  35.      *  
  36.      * @param $15 
  37.      * @return 
  38.      */  
  39.     private static String $15to18(String $15) {  
  40.         if ($15 == null) {  
  41.             return null;  
  42.         }  
  43.         if ($15.length() == 18) {  
  44.             return $15;  
  45.         }  
  46.         if ($15.length() != 15) {  
  47.             return null;  
  48.         }  
  49.         StringBuilder sb = new StringBuilder($15);  
  50.         sb.insert(6"19");// 加入年两位  
  51.         int result = 0;  
  52.         for (int i = 0; i < sb.length(); i++) {  
  53.             result += (Integer.parseInt(sb.charAt(i) + "")) * factor[i];  
  54.         }  
  55.         return sb.append(ch[result % 11]).toString();// 加入效验码  
  56.     }  
  57.   
  58.     /** 
  59.      * 验证第18位效验码 
  60.      *  
  61.      * @param idCardNumber 
  62.      * @return 
  63.      */  
  64.     private static boolean check18(String idCardNumber) {  
  65.         if (idCardNumber == null || idCardNumber.length() != 18) {  
  66.             return false;  
  67.         }  
  68.         int result = 0;  
  69.         for (int i = 0; i < idCardNumber.length() - 1; i++) {  
  70.             result += (Integer.parseInt(idCardNumber.charAt(i) + ""))  
  71.                     * factor[i];  
  72.         }  
  73.         return ch[result % 11] == idCardNumber.charAt(17);  
  74.     }  
  75.   
  76.     /** 
  77.      * 验证出生日期是否合法 
  78.      *  
  79.      * @param idCardNumber 
  80.      * @return 
  81.      */  
  82.     private static boolean checkBirthDay(int year, int month, int day) {  
  83.         if (year < 1900 || year > 2013) {  
  84.             return false;  
  85.         }  
  86.         if (month > 12 || month < 1) {  
  87.             return false;  
  88.         }  
  89.         if (day < 1) {  
  90.             return false;  
  91.         }  
  92.         byte[] dayOfMonth = { 312831303130313130313031 };  
  93.         if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {  
  94.             dayOfMonth[1] = 29;  
  95.         }  
  96.         return day <= dayOfMonth[month - 1];  
  97.     }  
  98.   
  99.     public static IdCard parse(String idCardNumber) {  
  100.         // 检查字符串  
  101.         if (!idCardNumber.matches("\\d{15}|\\d{18}|\\d{17}(?i)X")) {  
  102.             return null;  
  103.         }  
  104.         IdCard ic = new IdCard();  
  105.         // 15->18  
  106.         idCardNumber = $15to18(idCardNumber);  
  107.         // 检查效验码  
  108.         if (idCardNumber == null || !check18(idCardNumber)) {  
  109.             return null;  
  110.         }  
  111.         // 检查出生年月  
  112.         int year = Integer.parseInt(idCardNumber.substring(610));  
  113.         int month = Integer.parseInt(idCardNumber.substring(1012));  
  114.         int day = Integer.parseInt(idCardNumber.substring(1214));  
  115.         if (!checkBirthDay(year, month, day)) {  
  116.             return null;  
  117.         }  
  118.         ic.setNumber(idCardNumber);  
  119.         // 查询身份证归属地  
  120.         ic.setAddress(info.getProperty(idCardNumber.substring(06)));  
  121.         ic.setBirthday(String.format("%d-%d-%d",year, month, day));  
  122.         ic.setSex(1 == (Integer.parseInt(idCardNumber.charAt(16) + "") & 1));  
  123.         return ic;  
  124.     }  
  125.   
  126.     private static final Properties info;  
  127.     static {  
  128.         info = new Properties();  
  129.         try {  
  130.             info.load(new InputStreamReader(new FileInputStream(  
  131.                     "IdCard.properties"), "UTF-8"));  
  132.         } catch (Exception e) {  
  133.             e.printStackTrace();  
  134.         }  
  135.     }  
  136. }  

身份证实体类:

[java]  view plain copy print ?
  1. package j8;  
  2.   
  3.   
  4. public class IdCard {  
  5.       
  6.     private String number;  
  7.     private String address;  
  8.     private String birthday;  
  9.     private boolean sex;//true男.false女  
  10.       
  11.     public IdCard(){  
  12.           
  13.     }  
  14.       
  15.     public IdCard(String number, String address, String birthday, boolean sex) {  
  16.         this.number = number;  
  17.         this.address = address;  
  18.         this.birthday = birthday;  
  19.         this.sex = sex;  
  20.     }  
  21.     public String getNumber() {  
  22.         return number;  
  23.     }  
  24.     public void setNumber(String number) {  
  25.         this.number = number;  
  26.     }  
  27.     public String getAddress() {  
  28.         return address;  
  29.     }  
  30.     public void setAddress(String address) {  
  31.         this.address = address;  
  32.     }  
  33.     public String getBirthday() {  
  34.         return birthday;  
  35.     }  
  36.     public void setBirthday(String birthday) {  
  37.         this.birthday = birthday;  
  38.     }  
  39.     public boolean isSex() {  
  40.         return sex;  
  41.     }  
  42.     public void setSex(boolean sex) {  
  43.         this.sex = sex;  
  44.     }  
  45.       
  46.     public String toString(){  
  47.         return String.format("[号码:%s,地址:%s,出生:%s,性别:%s]",number,address,birthday,sex ? '男' : '女');  
  48.     }  
  49.       
  50. }  

四、结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值