已遷址

          已遷址http://www.cnblogs.com/live365wang/

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            28 隨筆 :: 0 文章 :: 1 評論 :: 0 Trackbacks
          package com.tg.user.controller;

          import java.text.SimpleDateFormat;
          import java.util.Calendar;
          import java.util.GregorianCalendar;
          import java.util.Hashtable;
          import java.util.regex.Matcher;
          import java.util.regex.Pattern;

          import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;

          public class IDCard {
              
          /*********************************** 身份證驗證開始 ****************************************/
              
          /**
               * 身份證號碼驗證 1、號碼的結構 公民身份號碼是特征組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,
               * 八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。 2、地址碼(前六位數)
               * 表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼,按GB/T2260的規定執行。 3、出生日期碼(第七位至十四位)
               * 表示編碼對象出生的年、月、日,按GB/T7408的規定執行,年、月、日代碼之間不用分隔符。 4、順序碼(第十五位至十七位)
               * 表示在同一地址碼所標識的區域范圍內,對同年、同月、同日出生的人編定的順序號, 順序碼的奇數分配給男性,偶數分配給女性。 5、校驗碼(第十八位數)
               * (1)十七位數字本體碼加權求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先對前17位數字的權求和
               * Ai:表示第i位置上的身份證號碼數字值 Wi:表示第i位置上的加權因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 
               * (2)計算模 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
               
          */

              
          /**
               * 功能:身份證的有效驗證
               * 
               * 
          @param IDStr
               *            身份證號
               * 
          @return 有效:返回"" 無效:返回String信息
               * 
          @throws ParseException
               
          */
              @SuppressWarnings(
          "unchecked")
              
          public static String IDCardValidate(String IDStr) throws ParseException {
                  String errorInfo 
          = "";// 記錄錯誤信息
                  String[] ValCodeArr = { "1""0""x""9""8""7""6""5""4",
                          
          "3""2" };
                  String[] Wi 
          = { "7""9""10""5""8""4""2""1""6""3""7",
                          
          "9""10""5""8""4""2" };
                  String Ai 
          = "";
                  
          // ================ 號碼的長度 15位或18位 ================
                  if (IDStr.length() != 15 && IDStr.length() != 18) {
                      errorInfo 
          = "身份證號碼長度應該為15位或18位。";
                      
          return errorInfo;
                  }
                  
          // =======================(end)========================

                  
          // ================ 數字 除最后以為都為數字 ================
                  if (IDStr.length() == 18) {
                      Ai 
          = IDStr.substring(017);
                  } 
          else if (IDStr.length() == 15) {
                      Ai 
          = IDStr.substring(06+ "19" + IDStr.substring(615);
                  }
                  
          if (isNumeric(Ai) == false) {
                      errorInfo 
          = "身份證15位號碼都應為數字 ; 18位號碼除最后一位外,都應為數字。";
                      
          return errorInfo;
                  }
                  
          // =======================(end)========================

                  
          // ================ 出生年月是否有效 ================
                  String strYear = Ai.substring(610);// 年份
                  String strMonth = Ai.substring(1012);// 月份
                  String strDay = Ai.substring(1214);// 月份
                  if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
                      errorInfo 
          = "身份證生日無效。";
                      
          return errorInfo;
                  }
                  GregorianCalendar gc 
          = new GregorianCalendar();
                  SimpleDateFormat s 
          = new SimpleDateFormat("yyyy-MM-dd");
                  
          try {
                      
          if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
                              
          || (gc.getTime().getTime() - s.parse(
                                      strYear 
          + "-" + strMonth + "-" + strDay).getTime()) < 0) {
                          errorInfo 
          = "身份證生日不在有效范圍。";
                          
          return errorInfo;
                      }
                  } 
          catch (NumberFormatException e) {
                      e.printStackTrace();
                  } 
          catch (java.text.ParseException e) {
                      e.printStackTrace();
                  }
                  
          if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
                      errorInfo 
          = "身份證月份無效";
                      
          return errorInfo;
                  }
                  
          if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
                      errorInfo 
          = "身份證日期無效";
                      
          return errorInfo;
                  }
                  
          // =====================(end)=====================

                  
          // ================ 地區碼時候有效 ================
                  Hashtable h = GetAreaCode();
                  
          if (h.get(Ai.substring(02)) == null) {
                      errorInfo 
          = "身份證地區編碼錯誤。";
                      
          return errorInfo;
                  }
                  
          // ==============================================

                  
          // ================ 判斷最后一位的值 ================
                  int TotalmulAiWi = 0;
                  
          for (int i = 0; i < 17; i++) {
                      TotalmulAiWi 
          = TotalmulAiWi
                              
          + Integer.parseInt(String.valueOf(Ai.charAt(i)))
                              
          * Integer.parseInt(Wi[i]);
                  }
                  
          int modValue = TotalmulAiWi % 11;
                  String strVerifyCode 
          = ValCodeArr[modValue];
                  Ai 
          = Ai + strVerifyCode;

                  
          if (IDStr.length() == 18) {
                      
          if (Ai.equals(IDStr) == false) {
                          errorInfo 
          = "身份證無效,不是合法的身份證號碼";
                          
          return errorInfo;
                      }
                  } 
          else {
                      
          return "";
                  }
                  
          // =====================(end)=====================
                  return "";
              }

              
          /**
               * 功能:設置地區編碼
               * 
               * 
          @return Hashtable 對象
               
          */
              @SuppressWarnings(
          "unchecked")
              
          private static Hashtable GetAreaCode() {
                  Hashtable hashtable 
          = new Hashtable();
                  hashtable.put(
          "11""北京");
                  hashtable.put(
          "12""天津");
                  hashtable.put(
          "13""河北");
                  hashtable.put(
          "14""山西");
                  hashtable.put(
          "15""內蒙古");
                  hashtable.put(
          "21""遼寧");
                  hashtable.put(
          "22""吉林");
                  hashtable.put(
          "23""黑龍江");
                  hashtable.put(
          "31""上海");
                  hashtable.put(
          "32""江蘇");
                  hashtable.put(
          "33""浙江");
                  hashtable.put(
          "34""安徽");
                  hashtable.put(
          "35""福建");
                  hashtable.put(
          "36""江西");
                  hashtable.put(
          "37""山東");
                  hashtable.put(
          "41""河南");
                  hashtable.put(
          "42""湖北");
                  hashtable.put(
          "43""湖南");
                  hashtable.put(
          "44""廣東");
                  hashtable.put(
          "45""廣西");
                  hashtable.put(
          "46""海南");
                  hashtable.put(
          "50""重慶");
                  hashtable.put(
          "51""四川");
                  hashtable.put(
          "52""貴州");
                  hashtable.put(
          "53""云南");
                  hashtable.put(
          "54""西藏");
                  hashtable.put(
          "61""陜西");
                  hashtable.put(
          "62""甘肅");
                  hashtable.put(
          "63""青海");
                  hashtable.put(
          "64""寧夏");
                  hashtable.put(
          "65""新疆");
                  hashtable.put(
          "71""臺灣");
                  hashtable.put(
          "81""香港");
                  hashtable.put(
          "82""澳門");
                  hashtable.put(
          "91""國外");
                  
          return hashtable;
              }

              
          /**
               * 功能:判斷字符串是否為數字
               * 
               * 
          @param str
               * 
          @return
               
          */
              
          private static boolean isNumeric(String str) {
                  Pattern pattern 
          = Pattern.compile("[0-9]*");
                  Matcher isNum 
          = pattern.matcher(str);
                  
          if (isNum.matches()) {
                      
          return true;
                  } 
          else {
                      
          return false;
                  }
              }

              
          /**
               * 功能:判斷字符串是否為日期格式
               * 
               * 
          @param str
               * 
          @return
               
          */
              
          public static boolean isDate(String strDate) {
                  Pattern pattern 
          = Pattern
                          .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])))))?$");
                  Matcher m 
          = pattern.matcher(strDate);
                  
          if (m.matches()) {
                      
          return true;
                  } 
          else {
                      
          return false;
                  }
              }

              
          /**
               * 
          @param args
               * 
          @throws ParseException
               
          */
              @SuppressWarnings(
          "static-access")
              
          public static void main(String[] args) throws ParseException {
                  
          // String IDCardNum="210102820826411";
                  
          // String IDCardNum="210102198208264114";
                  String IDCardNum = "210181198807193116";
                  IDCard cc 
          = new IDCard();
                  System.out.println(cc.IDCardValidate(IDCardNum));
                  
          // System.out.println(cc.isDate("1996-02-29"));
              }
              
          /*********************************** 身份證驗證結束 ****************************************/

          }
          posted on 2011-02-23 09:03 已遷址 閱讀(321) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 尼玛县| 额济纳旗| 蒙自县| 辉南县| 黄冈市| 大竹县| 南部县| 共和县| 滁州市| 名山县| 介休市| 平湖市| 阳信县| 思南县| 司法| 疏勒县| 吉木萨尔县| 三门县| 涞源县| 满洲里市| 阿尔山市| 阿拉尔市| 定边县| 临清市| 平谷区| 汉源县| 萝北县| 晋宁县| 泰安市| 视频| 涟源市| 金塔县| 连江县| 华容县| 石林| 包头市| 汝阳县| 日土县| 南投县| 阿合奇县| 安义县|