1. 程式人生 > >輸入身份證號,出生年月日、性別、判斷其地區

輸入身份證號,出生年月日、性別、判斷其地區

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

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 plaincopyprint?
  1. package j8;  
  2. import java.io.BufferedReader;  
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.util.Properties;  
  7. publicclass IdCardParser {  
  8.     publicstaticvoid main(String[] args) {  
  9.         try {  
  10.             System.out.println("請輸入您要查詢的身份證號碼:");  
  11.             InputStreamReader reader = new InputStreamReader(System.in);  
  12.             String str = new BufferedReader(reader).readLine();  
  13.             IdCard ic = IdCardParser.parse(str);  
  14.             if(ic != null){  
  15.                 System.out.println(ic);  
  16.             }else{  
  17.                 System.out.println("您輸入的有誤");  
  18.             }  
  19.         } catch (IOException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23.     privatestaticfinalbyte[] factor = { 7910584216379,  
  24.             1058421 };  
  25.     privatestaticfinalchar[] ch = { '1''0''X''9''8''7''6''5',  
  26.             '4''3''2' };  
  27.     /** 
  28.      * 15位身份證轉18位身份證.失敗返回null 
  29.      *  
  30.      * @param $15 
  31.      * @return 
  32.      */
  33.     privatestatic String $15to18(String $15) {  
  34.         if ($15 == null) {  
  35.             returnnull;  
  36.         }  
  37.         if ($15.length() == 18) {  
  38.             return $15;  
  39.         }  
  40.         if ($15.length() != 15) {  
  41.             returnnull;  
  42.         }  
  43.         StringBuilder sb = new StringBuilder($15);  
  44.         sb.insert(6"19");// 加入年兩位
  45.         int result = 0;  
  46.         for (int i = 0; i < sb.length(); i++) {  
  47.             result += (Integer.parseInt(sb.charAt(i) + "")) * factor[i];  
  48.         }  
  49.         return sb.append(ch[result % 11]).toString();// 加入效驗碼
  50.     }  
  51.     /** 
  52.      * 驗證第18位效驗碼 
  53.      *  
  54.      * @param idCardNumber 
  55.      * @return 
  56.      */
  57.     privatestaticboolean check18(String idCardNumber) {  
  58.         if (idCardNumber == null || idCardNumber.length() != 18) {  
  59.             returnfalse;  
  60.         }  
  61.         int result = 0;  
  62.         for (int i = 0; i < idCardNumber.length() - 1; i++) {  
  63.             result += (Integer.parseInt(idCardNumber.charAt(i) + ""))  
  64.                     * factor[i];  
  65.         }  
  66.         return ch[result % 11] == idCardNumber.charAt(17);  
  67.     }  
  68.     /** 
  69.      * 驗證出生日期是否合法 
  70.      *  
  71.      * @param idCardNumber 
  72.      * @return 
  73.      */
  74.     privatestaticboolean checkBirthDay(int year, int month, int day) {  
  75.         if (year < 1900 || year > 2013) {  
  76.             returnfalse;  
  77.         }  
  78.         if (month > 12 || month < 1) {  
  79.             returnfalse;  
  80.         }  
  81.         if (day < 1) {  
  82.             returnfalse;  
  83.         }  
  84.         byte[] dayOfMonth = { 312831303130313130313031 };  
  85.         if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {  
  86.             dayOfMonth[1] = 29;  
  87.         }  
  88.         return day <= dayOfMonth[month - 1];  
  89.     }  
  90.     publicstatic IdCard parse(String idCardNumber) {  
  91.         // 檢查字串
  92.         if (!idCardNumber.matches("\\d{15}|\\d{18}|\\d{17}(?i)X")) {  
  93.             returnnull;  
  94.         }  
  95.         IdCard ic = new IdCard();  
  96.         // 15->18
  97.         idCardNumber = $15to18(idCardNumber);  
  98.         // 檢查效驗碼
  99.         if (idCardNumber == null || !check18(idCardNumber)) {  
  100.             returnnull;  
  101.         }  
  102.         // 檢查出生年月
  103.         int year = Integer.parseInt(idCardNumber.substring(610));  
  104.         int month = Integer.parseInt(idCardNumber.substring(1012));  
  105.         int day = Integer.parseInt(idCardNumber.substring(1214));  
  106.         if (!checkBirthDay(year, month, day)) {  
  107.             returnnull;  
  108.         }  
  109.         ic.setNumber(idCardNumber);  
  110.         // 查詢身份證歸屬