身份证号码格式验证

来源:互联网 发布:美工收入 编辑:程序博客网 时间:2024/05/16 09:54
/** * 身份证验证 *@param certNo  号码内容 *@return 是否有效 null和"" 都是false */public static boolean isIDCard(String certNo){    if(certNo == null || (certNo.length() != 15 && certNo.length() != 18))        return false;    final char[] cs = certNo.toUpperCase().toCharArray();    //校验位数    int power = 0;    for(int i=0; i<cs.length; i++){        if(i==cs.length-1 && cs[i] == 'X')            break;//最后一位可以 是X或x        if(cs[i]<'0' || cs[i]>'9')            return false;        if(i < cs.length -1){            power += (cs[i] - '0') * POWER_LIST[i];        }    }    //校验区位码    if(!zoneNum.containsKey(Integer.valueOf(certNo.substring(0,2)))){        return false;    }    //校验年份    String year = certNo.length() == 15 ? getIdcardCalendar() + certNo.substring(6,8) :certNo.substring(6, 10);    final int iyear = Integer.parseInt(year);    if(iyear < 1900 || iyear > Calendar.getInstance().get(Calendar.YEAR))        return false;//1900年的PASS,超过今年的PASS    //校验月份    String month = certNo.length() == 15 ? certNo.substring(8, 10) : certNo.substring(10,12);    final int imonth = Integer.parseInt(month);    if(imonth <1 || imonth >12){        return false;    }    //校验天数    String day = certNo.length() ==15 ? certNo.substring(10, 12) : certNo.substring(12, 14);    final int iday = Integer.parseInt(day);    if(iday < 1 || iday > 31)        return false;    //校验"校验码"    if(certNo.length() == 15)        return true;    return cs[cs.length -1 ] == PARITYBIT[power % 11];}
0 0