首页>代码> java 18位身份证验证小组件idchecker>/idchecker/src/cn/idchecker/check/Checker.java
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;
	}



	
}
最近下载更多
aaaabbbc  LV1 2022年5月24日
zzs269285304  LV7 2020年10月29日
gww666  LV2 2019年6月5日
dongzhan  LV12 2019年5月6日
张老师123456  LV7 2019年4月12日
安宇12345  LV15 2019年3月25日
yu7510  LV15 2019年1月15日
依然在路上  LV17 2019年1月2日
安安an  LV17 2018年11月28日
huangqiwei  LV1 2018年10月13日
最近浏览更多
ClydeSon  LV5 2023年12月28日
一起加油  LV4 2023年3月24日
eddie2260  LV2 2022年6月17日
微微笑的笑笑  LV3 2022年6月14日
miiiji 2022年6月10日
暂无贡献等级
aaaabbbc  LV1 2022年5月24日
1306878374  LV13 2021年12月26日
zhaoxu123123  LV10 2021年9月9日
zzs269285304  LV7 2020年10月29日
Airavso  LV3 2020年7月26日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友