`

身份证号码分析

阅读更多

身份证号码工具类

 

身份证号码规则

摘自百度:

[根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。]

身份证工具方法

中华人民共和国居民身份证由两种,一种是15位身份证号码,一种是18位身份证号码.

以下是总结了一些身份证常用方法.不是很完整.

 

package cn.com.jody.util;

/**
 * 功能/模块:工具类<br>
 * 类描述:身份证工具类
 * 
 * @author JODY  
 */
public class CardUtil {
	// 经过计算得出的指数数组,算法:2的n-1次方求和,除以11取模
	// 如:2的0次方除以11取模=1,2的1次方除以11取模=2,2的2次方除以11取模=4
	// 加权因子
	static int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };

	// 校验位数组
	static char[] ai = { '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2' };

	/**
	 * 根据15位身份证号和出生日期计算得出18位身份证号
	 * 
	 * @param id15,15位身份证号
	 * @param birthday出生日期,19820329
	 * @return id18,返回18位身份证号
	 */
	public static String id15To18Number(String id15, String birthday) {
		if (isNullEmpty(id15) || id15.length() != 15 || isNullEmpty(birthday) || birthday.length() != 8) {
			return null;
		} else {
			return id15.substring(0, 6) + birthday.substring(0, 2) + id15.substring(6) + ai[checkBit(id15, birthday)];
		}
	}

	/**
	 * 判断字符串是否为null或者长度是否为0
	 * 
	 * @param text
	 *            字符串
	 * @return boolean
	 */
	public static boolean isNullEmpty(String text) {
		if (null == text) {
			return true;
		} else if (0 == text.length()) {
			return true;
		}
		return false;
	}

	/**
	 * 
	 * 根据15位身份证号和出生日期,计算校验位
	 * 
	 * @param id15,15位身份证号
	 * @param birthday出生日期,19820329
	 * @return mod,第18位校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod]
	 */
	public static int checkBit(String id15, String birthday) {
		id15 = id15.substring(0, 6) + birthday.substring(0, 2) + id15.substring(6);
		int sum = 0;
		// 计算校验位,前17位加权求和,然后除以11取模
		// S = Sum(Ai * Wi), i = 0, ... , 16 ,对前17位数字的权求和
		// Ai:表示第i位置上的身份证号码数字值
		// Wi:表示第i位置上的加权因子
		for (int i = 1; i < id15.length() + 1; i++) {
			sum = sum + wi[i - 1] * (Integer.parseInt(id15.substring(i - 1, i)));
		}
		int mod = sum % 11;
		return mod;
	}

	/**
	 * 根据传入的18位身份证号,计算校验位
	 * 
	 * @param id,18位身份证号
	 * @return mod,返回校验位,用于从ai数组取数作为身份证号的校验位,即ai[mod]
	 */
	public static int checkBit(String id) {
		String id17 = id.substring(0, 17);
		int sum = 0;
		for (int i = 0; i < id17.length(); i++) {
			int ai = Integer.parseInt(id17.substring(i, i + 1));
			sum += wi[i] * ai;
		}
		int mod = sum % 11;
		return mod;
	}

	/**
	 * 校验15位身份证号与出生日期
	 * 
	 * @param id,15位身份证号
	 * @param birthday,出生日期8位(19820329)
	 * @return result
	 */
	public static boolean checkId15BirthDay(String id, String birthday) {
		boolean result = false;
		String birth_id = id.substring(6, 12);// 6位日期
		String birth = birthday.substring(2);
		// 检验日期,出生日期与身份证中的出生日期相符,然后检验性别
		if (birth_id.equals(birth)) {
			result = true;
		} else {
			// 出生日期与身份证中的出生日期不相符
			result = false;
		}
		return result;
	}

	/**
	 * 校验15位身份证号与性别
	 * 
	 * @param id,15位身份证号
	 * @param sex,性别,
	 *            0-女 1-男
	 * @return result
	 */
	public static boolean checkId15Sex(String id, Integer sex) {
		boolean result = false;

		String temp = id.substring(14);// 最后一位代表性别
		int isex = Integer.parseInt(temp);
		// 男为奇数,女为偶数
		if (isex % 2 == sex) {
			result = true;
		} else {
			result = false;
		}
		return result;
	}

	/**
	 * 校验18位身份证号
	 * 
	 * @param id,18位身份证号
	 * @param birthday,出生日期8位(19820329)
	 * @param sex,性别, 0-女,1-男
	 * @return result
	 */
	public static boolean checkId18BirthDay(String id, String birthday) {
		boolean result = false;
		String birth_id = id.substring(6, 14);// 8位日期
		// 检验日期,出生日期与身份证中的出生日期相符,然后检验性别
		if (birth_id.equals(birthday)) {
			result = true;
		} else {
			// 出生日期与身份证中的出生日期不相符
			result = false;
		}
		return result;
	}

	/**
	 * 校验18位身份证号
	 * 
	 * @param id,18位身份证号
	 * @param birthday,出生日期8位(19820329)
	 * @param sex,性别,0-女,1-男
	 * @return result
	 */
	public static boolean checkId18Sex(String id, Integer sex) {
		boolean result = false;
		String temp = id.substring(16, 17);// 倒数第二位代表性别
		int isex = Integer.parseInt(temp);
		// 男为奇数,女为偶数
		if (isex % 2 == sex) {
			result = true;
		} else {
			result = false;
		}
		return result;
	}

	/**
	 * 获取18位身份证号的出生日期
	 * 
	 * @param id
	 * @return
	 */
	public static String getId18Birthday(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return null;
		String birthday = id.substring(6, 14);// 8位日期;
		return birthday;
	}

	/**
	 * 获取18位身份证号的性别
	 * 
	 * @param id
	 * @return
	 */
	public static Integer getId18Sex(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return null;
		String temp = id.substring(16, 17);// 倒数第二位代表性别
		int isex = Integer.parseInt(temp);
		// 男为奇数,女为偶数
		// 性别 0-女 1-男
		if (isex % 2 == 0) {
			return 0;
		} else {
			return 1;
		}
	}

	/**
	 * 验证身份证号码是否正确
	 * 
	 * @param id,18位身份证号码
	 * @return true 正常,false 错误
	 */
	public static boolean validId18(String id) {
		if (validId18IsNumber(id) && validId18IsBirthday(id) && validId18IsBit(id))
			return true;
		else
			return false;
	}

	/**
	 * 验证身份证字符是否为合法
	 * 
	 * @param id,18位身份证号码
	 * @return true 正常,false 错误
	 */
	public static boolean validId18IsNumber(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return false;
		// 验证前17位是否为数字
		for (int i = 0; i < 17; i++) {
			if (id.charAt(i) < '0' || id.charAt(i) > '9')
				return false;
		}
		return true;
	}

	/**
	 * 验证身份证出生日期是否合法
	 * 
	 * @param id,18位身份证号码
	 * @return true 正常,false 错误
	 */
	public static boolean validId18IsBirthday(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return false;
		// 验证出生日期
		int y = Integer.parseInt(id.substring(6, 10));
		int m = Integer.parseInt(id.substring(10, 12));
		int d = Integer.parseInt(id.substring(12, 14));
		if (y < 1900 || m < 1 || m > 12 || d < 1 || d > 31 || ((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) || (m == 2 && ((y % 4 > 0 && d > 28) || d > 29)))
			return false;
		return true;
	}

	/**
	 * 验证身份证验证数是否正确
	 * 
	 * @param id,18位身份证号码
	 * @return true 正常,false 错误
	 */
	public static boolean validId18IsBit(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return false;
		// 验证身份证验证位
		String bit = id.substring(17);
		String tbit = String.valueOf(ai[checkBit(id)]);
		if (!bit.equals(tbit))
			return false;
		return true;
	}

	public static void main(String[] args) {
		System.out.println(CardUtil.validId18("43102819841s312434"));
	}
}

 

 

分享到:
评论
1 楼 MyChina 2009-09-08  
不错啊,多谢分享!

相关推荐

Global site tag (gtag.js) - Google Analytics