package cn.javabs.utils; import cn.javabs.file.FileReaderWriter; /** * @author Mryang * 验证身份证信息 */ public class ValidatorCardNo { //校验加权因子数组 private static final int[] checkCodes = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //最后一位列表字符 private static final String str = "10X98765432" ; /** * 验证身份证号码位数是否为18位 * */ public static boolean validatorLength(String no){ return no.length() == 18 ? true : false ; } /** * 验证身份证号码是否是数字或最后一位是字母 * @param no * @return */ public static boolean validatorStyle(String no){ String last_char = no.substring(17, 18); if(!last_char.equals("0") && !ValidatorNum.isNum(last_char) && !last_char.equalsIgnoreCase("x")){ System.out.println("身份证最后一位出现非法字符!"); return false ; } if(!ValidatorNum.isNum(no.substring(1, 17))){ System.out.println("身份证前17位出现非数值字符!"); return false ; } return checkBirth(no); } /** * 验证身份证出生年月日是否合法 * @return 合法返回true,否则返回false */ public static boolean checkBirth(String no){ String birth = no.substring(6,14); int year, month, day; try{ year = Integer.valueOf(birth.substring(0,4)); month = Integer.valueOf(birth.substring(4,6)); day = Integer.valueOf(birth.substring(6, 8)); } catch (Exception e) { return false; } if((year >= 1900 && year <= 2010) && (month >=1 && month <= 12) && (day >= 1 && day <= 31)) { return true; } return false; } /** * 验证身份证地址码 * @param no * @return */ public static String checkAddrCode(String no){ String addr = FileReaderWriter.readAddress(no); return addr ; } /** * 验证身份证最后一位是否正确 * @param * @return */ public static boolean checkCheckCode(String no){ String chCode = no.substring(17,18); if(caculateCheckCode(no).equalsIgnoreCase(chCode)){ return true; } return false; } /** * 计算身份证最后一位 * @param 合法的身份证号码前17位 * @return 合法的身份证号码最后一位 */ public static String caculateCheckCode(String no){ int total = 0; //校验值和 int length = 18; //身份证长度 int[] ins = new int[length]; int i = 0; try{ for( ; i < length - 1; i++) { ins[i] = Integer.valueOf(no.substring(i, i+1)); total += (ins[i]*checkCodes[i]); } } catch(NumberFormatException e) { return null; } int modResult = total % 11; return str.substring(modResult, modResult+1); } }