package cn.idchecker.check; import java.util.HashSet; import java.util.Set; import cn.idchecker.addrs.DicReader; import cn.idchecker.entity.ID; /** * 身份证检验类 * @author rongxinhua * */ public class Checker { private ID id; //身份证号码 private String errorMsg = ""; //非法反馈信息 private Set<String> errorMsgs = new HashSet<String>(); //非法信息集合 private String addr = ""; //地址信息 /** * 构造方法 * @param num 身份证字符串,18位 */ public Checker(String num) { if(num.length()>=18) { this.id = new ID(num); } else { this.id = new ID("0000000000000000000"); } } /** * 总的身份证验证 * 验证顺序:长度 -> 生日 -> 最后一位校验码 -> 地址 * @return 若遇到有一项目不合法即返回false,所有验证通过才返回true */ public boolean check(){ boolean right = false; right = checkLength(); //验证长度 if(right){ right = checkBirth(); //验证生日 if(right) { right = checkCheckCode(); //验证最后一校验码 if(right) { right = checkAddr(); //验证地址 } } } return right; } /** * 总的身份证验证 * 验证项目包括长度、地址、生日、最后一位校验码 * @return 身份证合法则返回true,否则false */ public boolean checkAll(){ if(!checkLength()) { //验证长度 errorMsgs.add(errorMsg); return false; //长度都不对,其他的就不用验证了 } if(!checkAddr()){ errorMsgs.add(errorMsg); //验证地址 } if(!checkBirth()){ errorMsgs.add(errorMsg); //验证生日 } if(!checkCheckCode()){ //验证最后一位校验码 errorMsgs.add(errorMsg); } return errorMsgs.size()==0 ? true : false; } /** * 检查身份证长度是否正确 * @return 长度为18则返回true,否则返回false */ public boolean checkLength(){ int length = id.getNum().length(); if(length == 18) { return true; } errorMsg = "身份证长度不正确" ; return false; } /** * 验证身份证出生年月日是否合法 * @return 合法返回true,否则返回false */ public boolean checkBirth(){ String birth = id.getBirth(); //System.out.println(birth); 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 (NumberFormatException e) { errorMsg = "身份证生日码不正确!"; return false; } if((year >= 1900 && year <= 2010) && (month >=1 && month <= 12) && (day >= 1 && day <= 31)) { return true; } errorMsg = "身份证生日码不正确!"; return false; } /** * 验证地址码是否存在 * @return 存在返回true,不存在返回false */ public boolean checkAddr(){ String addrCode = id.getAddr(); //System.out.println("addrcode = " + addrCode); addr = DicReader.readAddress(addrCode); if(addr != null) { return true; } errorMsg = "身份证地址码不正确!"; return false; } /** * 验证校验码是否正确 * @return 正确返回true,否则返回false */ public boolean checkCheckCode(){ String chCode = id.caculateCheckCode(); //计算正确的末位校验码 if(id.getCheck().equalsIgnoreCase(chCode)){ return true; } errorMsg = "身份证校验码不正确, 正确的校验码是 " + chCode; return false; } /** * 获得出生年月日 * @return */ public String getBirth(){ return id.getFormatBirth(); } /** * 获得地址 * @return */ public String getAddr(){ if("".equals(addr)) { checkAddr(); } return addr; } /** * 获取性别 * @return */ public String getSex(){ return id.getSex(); } /** * 取得错误信息 * @return */ public String getErrorMsg(){ return errorMsg; } /** * 取得错误信息集合 * @return */ public Set<String> getErrorMsgs() { return errorMsgs; } /** * 取得身份证对象 * @return */ public ID getId() { return id; } }