<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    tinguo002

     

    JAVA身份證驗證

    public class IDCard {

          private String _codeError;

          //wi =2(n-1)(mod 11)
          final int[] wi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};
          // verify digit
          final int[] vi = {1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2};
          private int[] ai = new int[18];
          private static String[] _areaCode={"11","12","13","14","15","21","22"
              ,"23","31","32","33","34","35","36","37","41","42","43","44"
              ,"45","46","50","51","52","53","54","61","62","63","64","65","71","81","82","91"};
          private static HashMap<String,Integer> dateMap;
          private static HashMap<String,String> areaCodeMap;
          static{
                dateMap=new HashMap<String,Integer>();
                dateMap.put("01",31);
                dateMap.put("02",null);
                dateMap.put("03",31);
                dateMap.put("04",30);
                dateMap.put("05",31);
                dateMap.put("06",30);
                dateMap.put("07",31);
                dateMap.put("08",31);
                dateMap.put("09",30);
                dateMap.put("10",31);
                dateMap.put("11",30);
                dateMap.put("12",31);
                areaCodeMap=new HashMap<String,String>();
                for(String code:_areaCode){
                      areaCodeMap.put(code,null);
                }
          }

          //驗證身份證位數,15位和18位身份證
          public boolean verifyLength(String code){
                int length=code.length();
                if(length==15 || length==18){
                      return true;
                }else{
                      _codeError="錯誤:輸入的身份證號不是15位和18位的";
                      return false;
                }
          }

          //判斷地區碼
          public boolean verifyAreaCode(String code){
                String areaCode=code.substring(0,2);
    //            Element child=  _areaCodeElement.getChild("_"+areaCode);
                if(areaCodeMap.containsKey(areaCode)){
                      return true;
                }else{
                      _codeError="錯誤:輸入的身份證號的地區碼(1-2位)["+areaCode+"]不符合中國行政區劃分代碼規定(GB/T2260-1999)";
                      return false;
                }
          }

          //判斷月份和日期
          public boolean verifyBirthdayCode(String code){
                //驗證月份
                String month=code.substring(10,12);
                boolean isEighteenCode=(18==code.length());
                if(!dateMap.containsKey(month)){
                      _codeError="錯誤:輸入的身份證號"+(isEighteenCode?"(11-12位)":"(9-10位)")+"不存在["+month+"]月份,不符合要求(GB/T7408)";
                      return false;
                }
                //驗證日期
                String dayCode=code.substring(12,14);
                Integer day=dateMap.get(month);
                String yearCode=code.substring(6,10);
                Integer year=Integer.valueOf(yearCode);

                //非2月的情況
                if(day!=null){
                      if(Integer.valueOf(dayCode)>day || Integer.valueOf(dayCode)<1){
                            _codeError="錯誤:輸入的身份證號"+(isEighteenCode?"(13-14位)":"(11-13位)")+"["+dayCode+"]號不符合小月1-30天大月1-31天的規定(GB/T7408)";
                            return false;
                      }
                }
                //2月的情況
                else{
                      //閏月的情況
                      if((year%4==0&&year%100!=0)||(year%400==0)){
                            if(Integer.valueOf(dayCode)>29 || Integer.valueOf(dayCode)<1){
                                  _codeError="錯誤:輸入的身份證號"+(isEighteenCode?"(13-14位)":"(11-13位)")+"["+dayCode+"]號在"+year+"閏年的情況下未符合1-29號的規定(GB/T7408)";
                                  return false;
                            }
                      }
                      //非閏月的情況
                      else{
                            if (Integer.valueOf(dayCode) > 28 || Integer.valueOf(dayCode) < 1) {
                                  _codeError="錯誤:輸入的身份證號"+(isEighteenCode?"(13-14位)":"(11-13位)")+"["+dayCode+"]號在"+year+"平年的情況下未符合1-28號的規定(GB/T7408)";
                                  return false;
                            }
                      }
                }
                return true;
          }

          //驗證身份除了最后位其他的是否包含字母
          public boolean containsAllNumber(String code) {
                String str="";
                if(code.length()==15){
                      str=code.substring(0,15);
                }else if(code.length()==18){
                      str=code.substring(0,17);
                }
                char[] ch = str.toCharArray();
                for (int i = 0; i < ch.length; i++) {
                      if (! (ch[i] >= '0' && ch[i] <= '9')) {
                            _codeError="錯誤:輸入的身份證號第"+(i+1)+"位包含字母";
                            return false;
                      }
                }
                return true;
          }

          public String getCodeError(){
                return _codeError;
          }

          //驗證身份證
          public boolean verify(String idcard) {
                _codeError="";
                //驗證身份證位數,15位和18位身份證
                if(!verifyLength(idcard)){
                    return false;
                }
                //驗證身份除了最后位其他的是否包含字母
                if(!containsAllNumber(idcard)){
                      return false;
                }

                //如果是15位的就轉成18位的身份證
                String eifhteencard="";
                if (idcard.length() == 15) {
                      eifhteencard = uptoeighteen(idcard);
                }else{
                      eifhteencard=idcard;
                }
                //驗證身份證的地區碼
                if(!verifyAreaCode(eifhteencard)){
                      return false;
                }
                //判斷月份和日期
                if(!verifyBirthdayCode(eifhteencard)){
                      return false;
                }
                //驗證18位校驗碼,校驗碼采用ISO 7064:1983,MOD 11-2 校驗碼系統
                if(!verifyMOD(eifhteencard)){
                      return false;
                }
                return true;
          }

          //驗證18位校驗碼,校驗碼采用ISO 7064:1983,MOD 11-2 校驗碼系統
          public boolean verifyMOD(String code){
                String verify = code.substring(17, 18);
                if("x".equals(verify)){
                      code=code.replaceAll("x","X");
                      verify="X";
                }
                String verifyIndex=getVerify(code);
                if (verify.equals(verifyIndex)) {
                      return true;
                }
    //            int x=17;
    //            if(code.length()==15){
    //                  x=14;
    //            }
                _codeError="錯誤:輸入的身份證號最末尾的數字驗證碼錯誤";
                return false;
          }

          //獲得校驗位
          public String getVerify(String eightcardid) {
                int remaining = 0;

                if (eightcardid.length() == 18) {
                      eightcardid = eightcardid.substring(0, 17);
                }

                if (eightcardid.length() == 17) {
                      int sum = 0;
                      for (int i = 0; i < 17; i++) {
                            String k = eightcardid.substring(i, i + 1);
                            ai[i] = Integer.parseInt(k);
                      }

                      for (int i = 0; i < 17; i++) {
                            sum = sum + wi[i] * ai[i];
                      }
                      remaining = sum % 11;
                }

                return remaining == 2 ? "X" : String.valueOf(vi[remaining]);
          }

          //15位轉18位身份證
          public String uptoeighteen(String fifteencardid) {
                String eightcardid = fifteencardid.substring(0, 6);
                eightcardid = eightcardid + "19";
                eightcardid = eightcardid + fifteencardid.substring(6, 15);
                eightcardid = eightcardid + getVerify(eightcardid);
                return eightcardid;
          }



    調 用 new IDCard().verify(身份證id);
    轉載:http://www.oschina.net/code/snippet_249203_24013


    歡迎大家訪問我的個人網站 萌萌的IT人

    posted on 2014-02-27 10:45 一堣而安 閱讀(480) 評論(0)  編輯  收藏 所屬分類: java

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久免费精品视频| 免费人成大片在线观看播放电影| 国产真人无码作爱免费视频| 亚洲阿v天堂在线2017免费| 亚洲免费网站观看视频| 久久久久免费看黄A片APP| 亚洲激情视频网站| 成年人视频免费在线观看| 亚洲一区二区中文| 99热在线观看免费| 亚洲欧洲高清有无| 亚洲精品动漫免费二区| 亚洲综合一区无码精品| 日日夜夜精品免费视频| 亚洲欧美日韩一区二区三区| 国产美女精品久久久久久久免费 | 国产亚洲精品影视在线| 免费观看的毛片大全| 77777亚洲午夜久久多喷| 精品国产麻豆免费网站 | 大地资源在线资源免费观看| 亚洲A∨无码一区二区三区| 免费黄色福利视频| 亚洲精品一二三区| 亚洲国产aⅴ综合网| 三年片在线观看免费| 亚洲精品亚洲人成在线观看麻豆| 国产1024精品视频专区免费| 亚洲成a人片在线观看天堂无码| 亚洲第一黄色网址| 久久青草免费91线频观看不卡| 亚洲一区二区三区高清视频| 成人国产mv免费视频| 青青操免费在线视频| 亚洲午夜成激人情在线影院| 日韩毛片免费在线观看| 手机看片国产免费永久| 亚洲第一成年网站视频| 亚洲αv在线精品糸列| 99热在线精品免费全部my| 国产黄色片免费看|