您的位置:首页 > 编程语言 > Java开发

身份证转换工具类(Java)

2016-04-25 13:34 429 查看
工作中经常涉及到对身份证信息进行关操作的算法,特此整理出来分享。

15位的身份证号码转换成18位
18位的身份证号码转换成15位
传入18位的身份证号,得到生日
根据身份证号码获取年龄
传入身份证号,得到性别
传入身份证号,获取出生年份
判断输入的身份证号码是否符合身份证号的要求

package com.test;

import java.util.Calendar;

/**
* 身份证转换工具类
*
* <P>
* 第十八位数字的计算方法为:
* </P>
* <P>
* 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2;
* 2.将这17位数字和系数相乘的结果相加; 3.用加出来和除以11,看余数是多少? 4余数只可能有0 1 2 3 4 5 6 7 8 9
* 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
* 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
* </P>
*/
public class IDCardUtil {
/**
* 15位的身份证号码转换成18位
* @param idCardNo15 待转换的 15 位身份证号码
* @return
*/
public static String from15to18(String idCardNo) {
String finalID = null;// 最终的ID
if (!isIdCardNo(idCardNo))
throw new IllegalArgumentException("您输入的身份证号码不正确:" + idCardNo);
String century = "19";
if (idCardNo.length() == 18) {
finalID = idCardNo;
} else {
// 对应的17位的各个系数
int[] weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
5, 8, 4, 2 };

// 通过加入世纪码, 变成 17 位的新号码本体.
String tempNo = idCardNo.substring(0, 6) + century
+ idCardNo.substring(6);

// 下面算最后一位校验码
int checkSum = 0;
for (int i = 0; i < weight.length; i++) {
int ai = Integer.parseInt("" + tempNo.charAt(i)); // 位于 i 位置的数值
checkSum = checkSum + ai * weight[i];
}
// 求余数
int checkNum = checkSum % 11;
String lastNumber = null;
switch (checkNum) {
case 0:
lastNumber = "1";
break;
case 1:
lastNumber = "0";
break;
case 2:
lastNumber = "X";
break;
case 3:
lastNumber = "9";
break;
case 4:
lastNumber = "8";
break;
case 5:
lastNumber = "7";
break;
case 6:
lastNumber = "6";
break;
case 7:
lastNumber = "5";
break;
case 8:
lastNumber = "4";
break;
case 9:
lastNumber = "3";
break;
case 10:
lastNumber = "2";
break;
}
finalID = tempNo + lastNumber;
}

return finalID;

}

/**
* 18位的身份证号码转换成15位
* @param idCardNo18
* @return
*/
public static String from18to15(String idCardNo18) {
if (!(isIdCardNo(idCardNo18) && idCardNo18.length() == 18)) {
throw new IllegalArgumentException("身份证号参数格式不正确!");
}
return idCardNo18.substring(0, 6) + idCardNo18.substring(8, 17);
}

/**
* 传入18位的身份证号,得到生日,格式:19880101
* @param idCardNo18
* @return
*/
public static String getBirthday(String idCardNo18) {
return idCardNo18.substring(6, 14);
}

/**
* 根据身份证号码获取年龄
* @param idCardNo18
* @return
*/
public static int getAge(String idCardNo18) {
idCardNo18 = from15to18(idCardNo18);
// 当前年份
Calendar instance = Calendar.getInstance();
int currentYear = instance.get(Calendar.YEAR);
int age = currentYear - Integer.parseInt(getBirthYear(idCardNo18));
return age;
}

/**
* 传入身份证号,得到性别
* @param idCardNo18
* @return
*/
public static String getSex(String idCardNo18) {
idCardNo18 = from15to18(idCardNo18);
// 定位到倒数第二位
char c = idCardNo18.charAt(16);
String sex = "";
if (c % 2 != 0) {
sex = "男";
} else {
sex = "女";
}
return sex;
}

/**
* 传入身份证号,获取出生年份
* @param idCardNo18
* @return
*/
private static String getBirthYear(String idCardNo18) {
return idCardNo18.substring(6, 10);
}

/**
* 判断输入的身份证号码是否符合身份证号的要求
* @param idCardNO
* @return
*/
public static boolean isIdCardNo(String idCardNO) {
boolean isID = false;
if (idCardNO == null)
return false;
int len = idCardNO.length();
if (len != 15 && len != 18) {
isID = false;
} else {
// 排除最后一位是:X的情况
for (int i = 0; i < len; i++) {
try {
if (i < len - 1)
Integer.parseInt("" + idCardNO.charAt(i));
else if ((idCardNO.charAt(i) + "").equalsIgnoreCase("X")
|| Integer.parseInt("" + idCardNO.charAt(i)) > -1)
isID = true;
else
isID = false;
} catch (NumberFormatException e) {
return false;
}
}
}
return isID;
}

public static void main(String[] args) {
System.out.println(getSex(from15to18("110104830512301")));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java util 身份证