public static void main(String[] args) {
boolean isOk=checkCertificatenumByrules("12345678901111111");
}
public static boolean checkCertificatenumByrules(String certificatenum)
throws Exception {
if(certificatenum!=null){
certificatenum=certificatenum.trim();
if(certificatenum.length()!=15&&certificatenum.length()!=18){
System.out.println("身份证位数错误!");
return false;
}
}else{
System.out.println("身份证为空!");
return false;
}
Integer Y, S;//Y = S % 11;
String JYM="10X98765432", M;// js M = JYM.substr(Y, 1);
Map<String,Object> areaMap = new HashMap<String,Object>();
areaMap.put("11", "北京");areaMap.put("12", "天津");areaMap.put("13", "河北");
areaMap.put("14", "山西");areaMap.put("15", "内蒙古");areaMap.put("21", "辽宁");areaMap.put("22", "吉林");
areaMap.put("23", "黑龙江");areaMap.put("31", "上海");areaMap.put("32", "江苏");areaMap.put("33", "浙江");
areaMap.put("34", "安徽");areaMap.put("35", "福建");areaMap.put("36", "江西");areaMap.put("37", "山东");
areaMap.put("41", "河南");areaMap.put("42", "湖北");areaMap.put("43", "湖南");areaMap.put("44", "广东");
areaMap.put("45", "广西");areaMap.put("46", "海南");areaMap.put("50", "重庆");areaMap.put("51", "四川");
areaMap.put("52", "贵州");areaMap.put("53", "云南");areaMap.put("54", "西藏");areaMap.put("61", "陕西");
areaMap.put("62", "甘肃");areaMap.put("63", "青海");areaMap.put("64", "宁夏");areaMap.put("65", "新疆");
areaMap.put("71", "台湾");areaMap.put("81", "香港");areaMap.put("82", "澳门");areaMap.put("91", "国外");
String idcard_array []= certificatenum.split("");
// 地区检验
if(!areaMap.containsKey(certificatenum.substring(0, 2))){
System.out.println("身份证号码校验错误!");
return false;
}
// 身份号码位数及格式检验
String ereg;//正則表达式
switch (certificatenum.length()) {
case 15 :
if ((Integer.parseInt(certificatenum.substring(6, 8)) + 1900) % 4 == 0
|| ((Integer.parseInt(certificatenum.substring(6, 8)) + 1900) % 100 == 0
&& (Integer.parseInt(certificatenum.substring(6, 8)) + 1900)% 4 == 0)) {
ereg = "^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$";// 测试出生日期的合法性
} else {
ereg = "^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$";// 测试出生日期的合法性
}
if (Pattern.matches(ereg, certificatenum)){
return true;
}else{
System.out.println("身份证号码出生日期超出范围或含有非法字符!");
return false;
}
case 18 :
// 18位身份号码检测
// 出生日期的合法性检查
// 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
// 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if (Integer.parseInt(certificatenum.substring(6, 10)) % 4 == 0
|| (Integer.parseInt(certificatenum.substring(6, 10)) % 100 == 0
&& Integer.parseInt(certificatenum.substring(6, 10))% 4 == 0)) {
ereg = "^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$";// 闰年出生日期的合法性正则表达式
} else {
ereg = "^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$";// 平年出生日期的合法性正则表达式
}
if (Pattern.matches(ereg, certificatenum)) {// 测试出生日期的合法性
// 计算校验位
S = (Integer.parseInt(idcard_array[1]) + Integer.parseInt(idcard_array[11]))
* 7
+ (Integer.parseInt(idcard_array[2]) + Integer.parseInt(idcard_array[12]))
* 9
+ (Integer.parseInt(idcard_array[3]) + Integer.parseInt(idcard_array[13]))
* 10
+ (Integer.parseInt(idcard_array[4]) + Integer.parseInt(idcard_array[14]))
* 5
+ (Integer.parseInt(idcard_array[5]) + Integer.parseInt(idcard_array[15]))
* 8
+ (Integer.parseInt(idcard_array[6]) + Integer.parseInt(idcard_array[16]))
* 4
+ (Integer.parseInt(idcard_array[7]) + Integer.parseInt(idcard_array[17]))
* 2 + Integer.parseInt(idcard_array[8]) * 1
+ Integer.parseInt(idcard_array[9]) * 6
+ Integer.parseInt(idcard_array[10]) * 3;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.substring(Y, Y+1);// 判断校验位
if (M .equals( idcard_array[18])){
return true; // 检测ID的校验位
}else{
System.out.println("身份证号码校验错误!");
return false;
}
} else{
System.out.println("身份证号码出生日期超出范围或含有非法字符!");
return false;
}
default :
System.out.println("身份证位数错误!");
return false;
}
}