您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
身份证号码是每个公民的唯一标识,广泛应用于各种场景中。为了确保身份证号码的有效性,我们需要对其进行验证。本文将详细介绍如何使用JAVA编程语言来验证身份证号码的有效性。
18位身份证号码由以下几部分组成:
15位身份证号码由以下几部分组成:
18位身份证号码的校验规则主要包括以下几个方面:
15位身份证号码的校验规则主要包括以下几个方面:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
public class IDCardValidator {
private static final Map<Integer, String> zoneNum = new HashMap<>();
static {
zoneNum.put(11, "北京");
zoneNum.put(12, "天津");
zoneNum.put(13, "河北");
zoneNum.put(14, "山西");
zoneNum.put(15, "内蒙古");
zoneNum.put(21, "辽宁");
zoneNum.put(22, "吉林");
zoneNum.put(23, "黑龙江");
zoneNum.put(31, "上海");
zoneNum.put(32, "江苏");
zoneNum.put(33, "浙江");
zoneNum.put(34, "安徽");
zoneNum.put(35, "福建");
zoneNum.put(36, "江西");
zoneNum.put(37, "山东");
zoneNum.put(41, "河南");
zoneNum.put(42, "湖北");
zoneNum.put(43, "湖南");
zoneNum.put(44, "广东");
zoneNum.put(45, "广西");
zoneNum.put(46, "海南");
zoneNum.put(50, "重庆");
zoneNum.put(51, "四川");
zoneNum.put(52, "贵州");
zoneNum.put(53, "云南");
zoneNum.put(54, "西藏");
zoneNum.put(61, "陕西");
zoneNum.put(62, "甘肃");
zoneNum.put(63, "青海");
zoneNum.put(64, "宁夏");
zoneNum.put(65, "新疆");
zoneNum.put(71, "台湾");
zoneNum.put(81, "香港");
zoneNum.put(82, "澳门");
zoneNum.put(91, "国外");
}
private static final int[] PARITYBIT = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
private static final int[] POWER_LIST = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
public static boolean isValidIDCard(String idCard) {
if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
return false;
}
if (idCard.length() == 15) {
return validate15IDCard(idCard);
}
return validate18IDCard(idCard);
}
private static boolean validate18IDCard(String idCard) {
if (idCard == null || idCard.length() != 18) {
return false;
}
String idCard17 = idCard.substring(0, 17);
String idCard18Code = idCard.substring(17, 18);
char[] c;
String checkCode;
if (isDigital(idCard17)) {
c = idCard17.toCharArray();
} else {
return false;
}
int[] iCard = convertCharToInt(c);
int iSum17 = getPowerSum(iCard);
checkCode = getCheckCode18(iSum17);
if (null == checkCode) {
return false;
}
if (!idCard18Code.equalsIgnoreCase(checkCode)) {
return false;
}
return true;
}
private static boolean validate15IDCard(String idCard) {
if (idCard == null || idCard.length() != 15) {
return false;
}
if (isDigital(idCard)) {
String birthDay = idCard.substring(6, 12);
Date birthDate = null;
try {
birthDate = new SimpleDateFormat("yyMMdd").parse(birthDay);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
if (birthDate != null) {
cal.setTime(birthDate);
}
return valiDate(cal.get(Calendar.YEAR), (cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
} else {
return false;
}
}
private static boolean isDigital(String str) {
return str == null || "".equals(str) ? false : str.matches("^[0-9]*$");
}
private static int[] convertCharToInt(char[] ca) {
int len = ca.length;
int[] iArr = new int[len];
try {
for (int i = 0; i < len; i++) {
iArr[i] = Integer.parseInt(String.valueOf(ca[i]));
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return iArr;
}
private static int getPowerSum(int[] iArr) {
int iSum = 0;
if (POWER_LIST.length == iArr.length) {
for (int i = 0; i < iArr.length; i++) {
for (int j = 0; j < POWER_LIST.length; j++) {
if (i == j) {
iSum = iSum + iArr[i] * POWER_LIST[j];
}
}
}
}
return iSum;
}
private static String getCheckCode18(int iSum17) {
switch (iSum17 % 11) {
case 10:
return "2";
case 9:
return "3";
case 8:
return "4";
case 7:
return "5";
case 6:
return "6";
case 5:
return "7";
case 4:
return "8";
case 3:
return "9";
case 2:
return "x";
case 1:
return "0";
case 0:
return "1";
default:
return null;
}
}
private static boolean valiDate(int iYear, int iMonth, int iDay) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int datePerMonth;
if (iYear < 1900 || iYear >= year) {
return false;
}
if (iMonth < 1 || iMonth > 12) {
return false;
}
switch (iMonth) {
case 4:
case 6:
case 9:
case 11:
datePerMonth = 30;
break;
case 2:
boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0)) && (iYear > 1900 && iYear < year);
datePerMonth = dm ? 29 : 28;
break;
default:
datePerMonth = 31;
}
return (iDay >= 1) && (iDay <= datePerMonth);
}
}
public class IDCardValidator {
// ... 其他代码 ...
private static boolean validate15IDCard(String idCard) {
if (idCard == null || idCard.length() != 15) {
return false;
}
if (isDigital(idCard)) {
String birthDay = idCard.substring(6, 12);
Date birthDate = null;
try {
birthDate = new SimpleDateFormat("yyMMdd").parse(birthDay);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
if (birthDate != null) {
cal.setTime(birthDate);
}
return valiDate(cal.get(Calendar.YEAR), (cal.get(Calendar.MONTH) + 1), cal.get(Calendar.DAY_OF_MONTH));
} else {
return false;
}
}
// ... 其他代码 ...
}
public class IDCardValidator {
// ... 其他代码 ...
public static boolean isValidIDCard(String idCard) {
if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
return false;
}
if (idCard.length() == 15) {
return validate15IDCard(idCard);
}
return validate18IDCard(idCard);
}
// ... 其他代码 ...
}
本文详细介绍了如何使用JAVA编程语言来验证身份证号码的有效性。通过理解身份证号码的结构和校验规则,我们可以编写出高效的验证代码。希望本文能帮助你在实际项目中更好地应用身份证号码验证技术。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。