身份证号码工具类
身份证号码规则
摘自百度:
[根据〖中华人民共和国国家标准 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")); } }