package cn.idchecker.entity;
/**
 * 身份证号码
 * 例如:320105198209275127 -> 
 * addr   birth    seq  check
 * 320105 19820927 512  7
 * @author rongxinhua
 *
 */
public class ID {
	
	private String num;		//全长身份证号码
	private String addr;	//地址
	private String birth;	//生日
	private String seq;		//序号
	private String check;	//校验码
	
	
	/**
	 * 构造方法 1
	 * @param num 格式如:"320105198209275127"
	 */
	public ID(String num) {
		this.num = num;
		this.addr = num.substring(0, 6);
		this.birth = num.substring(6, 14);
		this.seq = num.substring(14,17);
		this.check = num.substring(17,18);
	}
	
	/**
	 * 构造方法 2
	 * @param addr 地址码, 格式如:"320105"
	 * @param birth 生日码,格式如:"19820927"
	 * @param seq 顺序码,格式如:"512"
	 * @param check 校验码,格式如:"7"
	 */
	public ID(String addr, String birth, String seq, String check) {
		this.addr = addr;
		this.birth = birth;
		this.seq = seq;
		this.check = check;
		this.num = addr + birth + seq + check;
	}
	/**
	 * 分离身份证号码
	 * @return 字符数组
	 */
	public char[] separate(){
		return this.num.toCharArray();
	}
	
	/**
	 * 分离身份证号码
	 * @return 整型数组,最后一位若是'X',则返回10
	 */
	public int[] separate2int(){
		int length = 18;
		int[] ins = new int[length];
		int i = 0;
		for( ; i < length - 1; i ++) {
			ins[i] = Integer.valueOf(num.substring(i, i+1));
		}
		String last = num.substring(i, i+1);
		ins[i] = "X".equals(last) ? 10 : Integer.valueOf(last);
		return ins;
	}
	
	/**
	 * 计算校验位
	 * @return 
	 */
	public String caculateCheckCode(){
		int total = 0;		//校验值和
		int length = 18;	//身份证长度
		int[] ins = new int[length];
		int[] checkCodes = Checkcode.checkCodes;
		int i = 0;
		try{
			for( ; i < length - 1; i ++) {
				ins[i] = Integer.valueOf(num.substring(i, i+1));
				total += (ins[i]*checkCodes[i]);
			}
		} catch(NumberFormatException e) {
			return null;
		}
		
		int modResult = total % 11;
		return Checkcode.checkResult(modResult);
		
	}
	
	/**
	 * 获取中文格式的出生年月日
	 * @return 
	 */
	public String getFormatBirth(){
		return birth.substring(0, 4) + "年" + birth.substring(4,6) + "月" + birth.substring(6,8) + "日";
	}
	
	/**
	 * 获取性别
	 * @return
	 */
	public String getSex() {
		return seq.charAt(2)%2 == 0 ? "女" : "男";
	}
	
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getBirth() {
		return birth;
	}
	public void setBirth(String birth) {
		this.birth = birth;
	}
	public String getSeq() {
		return seq;
	}
	public void setSeq(String seq) {
		this.seq = seq;
	}
	public String getCheck() {
		return check;
	}
	public void setCheck(String check) {
		this.check = check;
	}
	
	public String getNum() {
		return num;
	}
	public void setNum(String num) {
		this.num = num;
	}
	
}