歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java代碼實現15位身份證號碼升級到18位

18位身份證號碼的組成:
公民身份號碼是特征組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼, 三位數字順序碼和一位數字校驗碼。
六位數字地址碼:
1-2位省、自治區、直轄市代碼;
3-4位地級市、盟、自治州代碼;
5-6位縣、縣級市、區代碼;
順序碼:
表示在同一地址碼所標識的區域范圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。
校驗碼:
S = Ai * Wi, i = 2, ... , 18
Y = mod(S, 11)
i: 表示號碼字符從右至左包括校驗碼字符在內的位置序號
Ai:表示第i位置上的身份證號碼字符值
Wi:表示第i位置上的加權因子
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
校驗碼: 1 0 X 9 8 7 6 5 4 3 2

15位身份證號碼的組成:
六位數字地址碼,和18位一樣,但出生日期只有年代,沒有帶世紀19,三位數字順序碼,沒有校驗碼。
所以在升級時,需要在六位數字地址碼後加上世紀19(因為15位身份證都是2000年前的了,之後的身份證都是18位的了),還要生成校驗碼。


具體代碼如下:

  1. package com.mmq;  
  2.   
  3. /** 
  4.  * @use 15位身份證升級、校驗 
  5.  * @ProjectName stuff 
  6.  * @http://www.linuxidc.com
  7.  * @Author <a href="mailto:[email protected]">mumaoqiang</a></br> 
  8.  * @Date 2011-5-13 下午09:53:09 </br> 
  9.  * @FullName com.mmq.VerifyIDCardNumber.java </br> 
  10.  * @JDK 1.6.0 </br> 
  11.  * @Version 1.0 </br> 
  12.  */  
  13. public class VerifyIDCardNumber {  
  14.       
  15.     /** 
  16.      * 根據15位的身份證號碼獲得18位身份證號碼 
  17.      * @param fifteenIDCard 15位的身份證號碼 
  18.      * @return 升級後的18位身份證號碼 
  19.      * @throws Exception 如果不是15位的身份證號碼,則拋出異常 
  20.      */  
  21.     public String getEighteenIDCard(String fifteenIDCard) throws Exception{  
  22.         if(fifteenIDCard != null && fifteenIDCard.length() == 15){  
  23.             StringBuilder sb = new StringBuilder();  
  24.             sb.append(fifteenIDCard.substring(06))  
  25.               .append("19")  
  26.               .append(fifteenIDCard.substring(6));  
  27.             sb.append(getVerifyCode(sb.toString()));  
  28.             return sb.toString();  
  29.         } else {  
  30.             throw new Exception("不是15位的身份證");  
  31.         }  
  32.     }  
  33.       
  34.     /** 
  35.      * 獲取校驗碼 
  36.      * @param idCardNumber 不帶校驗位的身份證號碼(17位) 
  37.      * @return 校驗碼 
  38.      * @throws Exception 如果身份證沒有加上19,則拋出異常 
  39.      */  
  40.     public char getVerifyCode(String idCardNumber) throws Exception{  
  41.         if(idCardNumber == null || idCardNumber.length() < 17) {  
  42.             throw new Exception("不合法的身份證號碼");  
  43.         }  
  44.         char[] Ai = idCardNumber.toCharArray();  
  45.         int[] Wi = {7910584216379105842};  
  46.         char[] verifyCode = {'1','0''X''9''8''7''6''5''4''3''2'};  
  47.         int S = 0;  
  48.         int Y;  
  49.         for(int i = 0; i < Wi.length; i++){  
  50.             S += (Ai[i] - '0') * Wi[i];  
  51.         }  
  52.         Y = S % 11;  
  53.         return verifyCode[Y];  
  54.     }  
  55.       
  56.     /** 
  57.      * 校驗18位的身份證號碼的校驗位是否正確 
  58.      * @param idCardNumber 18位的身份證號碼 
  59.      * @return  
  60.      * @throws Exception 
  61.      */  
  62.     public static boolean verify(String idCardNumber) throws Exception{  
  63.         if(idCardNumber == null || idCardNumber.length() != 18) {  
  64.             throw new Exception("不是18位的身份證號碼");  
  65.         }  
  66.         return getVerifyCode(idCardNumber) == idCardNumber.charAt(idCardNumber.length() - 1);  
  67.     }  
  68. }  
Copyright © Linux教程網 All Rights Reserved