隨筆-13  評論-12  文章-3  trackbacks-0
             1/*********************************** 身份證驗證開始 ****************************************/       
             
          2.     /**   
             3.      * 身份證號碼驗證    
             4.      * 1、號碼的結構   
             5.      * 公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,   
             6.      * 八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗碼。   
             7.      * 2、地址碼(前六位數(shù))    
             8.      * 表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。    
             9.      * 3、出生日期碼(第七位至十四位)   
            10.      * 表示編碼對象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。    
            11.      * 4、順序碼(第十五位至十七位)   
            12.      * 表示在同一地址碼所標識的區(qū)域范圍內,對同年、同月、同日出生的人編定的順序號,   
            13.      * 順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。    
            14.      * 5、校驗碼(第十八位數(shù))   
            15.      * (1)十七位數(shù)字本體碼加權求和公式 S = Sum(Ai * Wi), i = 0,  , 16 ,先對前17位數(shù)字的權求和   
            16.      * Ai:表示第i位置上的身份證號碼數(shù)字值 Wi:表示第i位置上的加權因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4   
            17.      * 2 (2)計算模 Y = mod(S, 11) (3)通過模得到對應的校驗碼 Y: 0 1 2 3 4 5 6 7 8 9 10 校驗碼: 1 0   
            18.      * X 9 8 7 6 5 4 3 2   
            19.      
          */    
            
          20.     
            
          21.     /**   
            22.      * 功能:身份證的有效驗證   
            23.      * 
          @param IDStr 身份證號   
            24.      * 
          @return 有效:返回"" 無效:返回String信息   
            25.      * 
          @throws ParseException   
            26.      
          */    
            
          27.     @SuppressWarnings("unchecked")     
            
          28.     public static String IDCardValidate(String IDStr) throws ParseException {     
            
          29.         String errorInfo = "";// 記錄錯誤信息     
            30.         String[] ValCodeArr = { "1""0""x""9""8""7""6""5""4",     
            
          31.                 "3""2" };     
            
          32.         String[] Wi = { "7""9""10""5""8""4""2""1""6""3""7",     
            
          33.                 "9""10""5""8""4""2" };     
            
          34.         String Ai = "";     
            
          35.         // ================ 號碼的長度 15位或18位 ================     
            36.         if (IDStr.length() != 15 && IDStr.length() != 18) {     
            
          37.             errorInfo = "身份證號碼長度應該為15位或18位。";     
            
          38.             return errorInfo;     
            
          39.         }     
            
          40.         // =======================(end)========================     
            41.     
            
          42.         // ================ 數(shù)字 除最后以為都為數(shù)字 ================     
            43.         if (IDStr.length() == 18) {     
            
          44.             Ai = IDStr.substring(017);     
            
          45.         } else if (IDStr.length() == 15) {     
            
          46.             Ai = IDStr.substring(06+ "19" + IDStr.substring(615);     
            
          47.         }     
            
          48.         if (isNumeric(Ai) == false) {     
            
          49.             errorInfo = "身份證15位號碼都應為數(shù)字 ; 18位號碼除最后一位外,都應為數(shù)字。";     
            
          50.             return errorInfo;     
            
          51.         }     
            
          52.         // =======================(end)========================     
            53.     
            
          54.         // ================ 出生年月是否有效 ================     
            55.         String strYear = Ai.substring(610);// 年份     
            56.         String strMonth = Ai.substring(1012);// 月份     
            57.         String strDay = Ai.substring(1214);// 月份     
            58.         if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {     
            
          59.             errorInfo = "身份證生日無效。";     
            
          60.             return errorInfo;     
            
          61.         }     
            
          62.         GregorianCalendar gc = new GregorianCalendar();     
            
          63.         SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");     
            
          64.         if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150    
            
          65.                 || (gc.getTime().getTime() - s.parse(     
            
          66.                         strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {     
            
          67.             errorInfo = "身份證生日不在有效范圍。";     
            
          68.             return errorInfo;     
            
          69.         }     
            
          70.         if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {     
            
          71.             errorInfo = "身份證月份無效";     
            
          72.             return errorInfo;     
            
          73.         }     
            
          74.         if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {     
            
          75.             errorInfo = "身份證日期無效";     
            
          76.             return errorInfo;     
            
          77.         }     
            
          78.         // =====================(end)=====================     
            79.     
            
          80.         // ================ 地區(qū)碼時候有效 ================     
            81.         Hashtable h = GetAreaCode();     
            
          82.         if (h.get(Ai.substring(02)) == null) {     
            
          83.             errorInfo = "身份證地區(qū)編碼錯誤。";     
            
          84.             return errorInfo;     
            
          85.         }     
            
          86.         // ==============================================     
            87.     
            
          88.         // ================ 判斷最后一位的值 ================     
            89.         int TotalmulAiWi = 0;     
            
          90.         for (int i = 0; i < 17; i++) {     
            
          91.             TotalmulAiWi = TotalmulAiWi     
            
          92.                     + Integer.parseInt(String.valueOf(Ai.charAt(i)))     
            
          93.                     * Integer.parseInt(Wi[i]);     
            
          94.         }     
            
          95.         int modValue = TotalmulAiWi % 11;     
            
          96.         String strVerifyCode = ValCodeArr[modValue];     
            
          97.         Ai = Ai + strVerifyCode;     
            
          98.     
            
          99.         if (IDStr.length() == 18) {     
           
          100.             if (Ai.equals(IDStr) == false) {     
           
          101.                 errorInfo = "身份證無效,不是合法的身份證號碼";     
           
          102.                 return errorInfo;     
           
          103.             }     
           
          104.         } else {     
           
          105.             return "";     
           
          106.         }     
           
          107.         // =====================(end)=====================     
           108.         return "";     
           
          109.     }     
           
          110.     
           
          111.     /**   
           112.      * 功能:設置地區(qū)編碼   
           113.      * 
          @return Hashtable 對象   
           114.      
          */    
           
          115.     @SuppressWarnings("unchecked")     
           
          116.     private static Hashtable GetAreaCode() {     
           
          117.         Hashtable hashtable = new Hashtable();     
           
          118.         hashtable.put("11""北京");     
           
          119.         hashtable.put("12""天津");     
           
          120.         hashtable.put("13""河北");     
           
          121.         hashtable.put("14""山西");     
           
          122.         hashtable.put("15""內蒙古");     
           
          123.         hashtable.put("21""遼寧");     
           
          124.         hashtable.put("22""吉林");     
           
          125.         hashtable.put("23""黑龍江");     
           
          126.         hashtable.put("31""上海");     
           
          127.         hashtable.put("32""江蘇");     
           
          128.         hashtable.put("33""浙江");     
           
          129.         hashtable.put("34""安徽");     
           
          130.         hashtable.put("35""福建");     
           
          131.         hashtable.put("36""江西");     
           
          132.         hashtable.put("37""山東");     
           
          133.         hashtable.put("41""河南");     
           
          134.         hashtable.put("42""湖北");     
           
          135.         hashtable.put("43""湖南");     
           
          136.         hashtable.put("44""廣東");     
           
          137.         hashtable.put("45""廣西");     
           
          138.         hashtable.put("46""海南");     
           
          139.         hashtable.put("50""重慶");     
           
          140.         hashtable.put("51""四川");     
           
          141.         hashtable.put("52""貴州");     
           
          142.         hashtable.put("53""云南");     
           
          143.         hashtable.put("54""西藏");     
           
          144.         hashtable.put("61""陜西");     
           
          145.         hashtable.put("62""甘肅");     
           
          146.         hashtable.put("63""青海");     
           
          147.         hashtable.put("64""寧夏");     
           
          148.         hashtable.put("65""新疆");     
           
          149.         hashtable.put("71""臺灣");     
           
          150.         hashtable.put("81""香港");     
           
          151.         hashtable.put("82""澳門");     
           
          152.         hashtable.put("91""國外");     
           
          153.         return hashtable;     
           
          154.     }     
           
          155.     
           
          156.     /**   
           157.      * 功能:判斷字符串是否為數(shù)字   
           158.      * 
          @param str   
           159.      * 
          @return   
           160.      
          */    
           
          161.     private static boolean isNumeric(String str) {     
           
          162.         Pattern pattern = Pattern.compile("[0-9]*");     
           
          163.         Matcher isNum = pattern.matcher(str);     
           
          164.         if (isNum.matches()) {     
           
          165.             return true;     
           
          166.         } else {     
           
          167.             return false;     
           
          168.         }     
           
          169.     }     
           
          170.     
           
          171.     /**   
           172.      * 功能:判斷字符串是否為日期格式   
           173.      * 
          @param str   
           174.      * 
          @return   
           175.      
          */    
           
          176.     public static boolean isDate(String strDate) {     
           
          177.         Pattern pattern = Pattern     
           
          178.                 .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]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$");     
           
          179.         Matcher m = pattern.matcher(strDate);     
           
          180.         if (m.matches()) {     
           
          181.             return true;     
           
          182.         } else {     
           
          183.             return false;     
           
          184.         }     
           
          185.     }     
           
          186.     
           
          187.     /**   
           188.      * 
          @param args   
           189.      * 
          @throws ParseException   
           190.      
          */    
           
          191//  public static void main(String[] args) throws ParseException {     
           192//      // String IDCardNum="210102820826411";     
           193//      // String IDCardNum="210102198208264114";     
           194//      String IDCardNum = "500113198606245216";     
           195//      CommonUtil cc = new CommonUtil();     
           196//      System.out.println(cc.IDCardValidate(IDCardNum));     
           197//      // System.out.println(cc.isDate("1996-02-29"));     
           198//  }     
           199/*********************************** 身份證驗證結束 ****************************************/  
          posted on 2011-01-03 20:56 zeroline 閱讀(9170) 評論(8)  編輯  收藏 所屬分類: JavaSE

          評論:
          # re: JAVA代碼驗證身份證信息 2011-01-04 14:07 | Ziplj
          你好 請問一下BlogJava可以上傳文件嗎? 我不知道這個可不可以 要是可以的話我也去開一個 Thanks !  回復  更多評論
            
          # re: JAVA代碼驗證身份證信息 2011-01-04 14:30 | xylz
          最近正用得著,懶得寫,借用下,thx  回復  更多評論
            
          # re: JAVA代碼驗證身份證信息 2011-01-04 20:32 | zeroline
          @Ziplj
          可以的 我決定blogJava里開發(fā)的人沒有 csdn的多....  回復  更多評論
            
          # re: JAVA代碼驗證身份證信息 2011-01-05 10:00 | xylz
          # re: JAVA代碼驗證身份證信息 2011-11-20 09:55 | 王興
          我想請問他的身份證號碼是否是真的  回復  更多評論
            
          # re: JAVA代碼驗證身份證信息 2013-07-31 11:48 | xtt
          開始判斷時應該判斷一下是否為null 要不然傳入null會報空指針的  回復  更多評論
            
          # re: JAVA代碼驗證身份證信息 2013-10-28 17:11 | wq
          你好 15位 好像不能驗證  回復  更多評論
            
          # re: JAVA代碼驗證身份證信息 2015-08-06 06:33 | 王佳明
          不錯
            回復  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 宜宾县| 郸城县| 永新县| 库伦旗| 托克逊县| 邛崃市| 射洪县| 丽江市| 辽宁省| 乌什县| 庄河市| 来宾市| 广昌县| 沂源县| 呼伦贝尔市| 聊城市| 响水县| 繁峙县| 察隅县| 五华县| 吉林市| 高雄市| 杂多县| 青州市| 渭源县| 稻城县| 抚顺市| 绿春县| 饶阳县| 吉水县| 汉中市| 宝山区| 扶沟县| 绵竹市| 衢州市| 通榆县| 兴隆县| 盐城市| 进贤县| 东至县| 开原市|