4 changed files with 220 additions and 27 deletions
@ -1,19 +1,212 @@ |
|||
package com.epmet.commons.tools.validator; |
|||
|
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import java.text.SimpleDateFormat; |
|||
import java.util.Calendar; |
|||
import java.util.GregorianCalendar; |
|||
import java.util.Hashtable; |
|||
import java.util.regex.Matcher; |
|||
import java.util.regex.Pattern; |
|||
|
|||
import static java.util.regex.Pattern.*; |
|||
|
|||
/** |
|||
* 描述一下 |
|||
* 身份证号校验 |
|||
* |
|||
* @author yinzuomei@elink-cn.com |
|||
* @date 2020/6/18 9:59 |
|||
*/ |
|||
public class IdCardNoValidatorUtils { |
|||
//判断身份证号是否正确
|
|||
public static boolean checkIsIdCardNo(String idCardNo){ |
|||
return true; |
|||
|
|||
private static Logger logger = LoggerFactory.getLogger(IdCardNoValidatorUtils.class); |
|||
|
|||
/** |
|||
* 身份证验证 |
|||
* |
|||
* @param idCardNo |
|||
* @return 校验信息,correct为成功,失败会返回对应的失败原因 |
|||
*/ |
|||
public static boolean checkIsIdCardNo(String idCardNo) { |
|||
String[] wf = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; |
|||
String[] checkCode = {"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"}; |
|||
String iDCardNo = ""; |
|||
try { |
|||
//判断号码的长度 15位或18位
|
|||
if (idCardNo.length() != 15 && idCardNo.length() != 18) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "身份证号码长度应该为15位或18位")); |
|||
return false; |
|||
} |
|||
if (idCardNo.length() == 18) { |
|||
String lastStr = idCardNo.substring(idCardNo.length() - 1); |
|||
if (!Character.isDigit(lastStr.charAt(0))) { |
|||
if (Character.isLowerCase(lastStr.charAt(0))) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "18身份证号最后一位字母需要大写")); |
|||
return false; |
|||
} |
|||
} else { |
|||
logger.info(String.format("身份证号%s最后一位为数字")); |
|||
} |
|||
} |
|||
if (idCardNo.length() == 18) { |
|||
iDCardNo = idCardNo.substring(0, 17); |
|||
} else if (idCardNo.length() == 15) { |
|||
iDCardNo = idCardNo.substring(0, 6) + "19" + idCardNo.substring(6, 15); |
|||
} |
|||
if (isStrNum(iDCardNo) == false) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "身份证15位号码都应为数字;18位号码除最后一位外,都应为数字")); |
|||
return false; |
|||
} |
|||
//判断出生年月
|
|||
String strYear = iDCardNo.substring(6, 10);// 年份
|
|||
String strMonth = iDCardNo.substring(10, 12);// 月份
|
|||
String strDay = iDCardNo.substring(12, 14);// 月份
|
|||
if (isStrDate(strYear + "-" + strMonth + "-" + strDay) == false) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "身份证生日无效")); |
|||
return false; |
|||
} |
|||
GregorianCalendar gc = new GregorianCalendar(); |
|||
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd"); |
|||
if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150 || (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "身份证生日不在有效范围")); |
|||
return false; |
|||
} |
|||
if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "身份证月份无效")); |
|||
return false; |
|||
} |
|||
if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "身份证日期无效")); |
|||
return false; |
|||
} |
|||
//判断地区码
|
|||
Hashtable h = GetAreaCode(); |
|||
if (h.get(iDCardNo.substring(0, 2)) == null) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "身份证地区编码错误")); |
|||
return false; |
|||
} |
|||
//判断最后一位
|
|||
int theLastOne = 0; |
|||
for (int i = 0; i < 17; i++) { |
|||
theLastOne = theLastOne + Integer.parseInt(String.valueOf(iDCardNo.charAt(i))) * Integer.parseInt(checkCode[i]); |
|||
} |
|||
int modValue = theLastOne % 11; |
|||
String strVerifyCode = wf[modValue]; |
|||
iDCardNo = iDCardNo + strVerifyCode; |
|||
|
|||
if (idCardNo.length() == 18 && !iDCardNo.equals(idCardNo)) { |
|||
logger.error(String.format("校验身份证号:%s错误:%s", idCardNo, "身份证无效,不是合法的身份证号码")); |
|||
return false; |
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
logger.error(String.format("校验身份证号方法异常")); |
|||
e.printStackTrace(); |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* 地区代码 |
|||
* |
|||
* @return Hashtable |
|||
*/ |
|||
private static Hashtable GetAreaCode() { |
|||
Hashtable<String, String> hashtable = new Hashtable<String, String>(); |
|||
hashtable.put("11", "北京"); |
|||
hashtable.put("12", "天津"); |
|||
hashtable.put("13", "河北"); |
|||
hashtable.put("14", "山西"); |
|||
hashtable.put("15", "内蒙古"); |
|||
hashtable.put("21", "辽宁"); |
|||
hashtable.put("22", "吉林"); |
|||
hashtable.put("23", "黑龙江"); |
|||
hashtable.put("31", "上海"); |
|||
hashtable.put("32", "江苏"); |
|||
hashtable.put("33", "浙江"); |
|||
hashtable.put("34", "安徽"); |
|||
hashtable.put("35", "福建"); |
|||
hashtable.put("36", "江西"); |
|||
hashtable.put("37", "山东"); |
|||
hashtable.put("41", "河南"); |
|||
hashtable.put("42", "湖北"); |
|||
hashtable.put("43", "湖南"); |
|||
hashtable.put("44", "广东"); |
|||
hashtable.put("45", "广西"); |
|||
hashtable.put("46", "海南"); |
|||
hashtable.put("50", "重庆"); |
|||
hashtable.put("51", "四川"); |
|||
hashtable.put("52", "贵州"); |
|||
hashtable.put("53", "云南"); |
|||
hashtable.put("54", "西藏"); |
|||
hashtable.put("61", "陕西"); |
|||
hashtable.put("62", "甘肃"); |
|||
hashtable.put("63", "青海"); |
|||
hashtable.put("64", "宁夏"); |
|||
hashtable.put("65", "新疆"); |
|||
hashtable.put("71", "台湾"); |
|||
hashtable.put("81", "香港"); |
|||
hashtable.put("82", "澳门"); |
|||
hashtable.put("91", "国外"); |
|||
return hashtable; |
|||
} |
|||
|
|||
/** |
|||
* 判断字符串是否为数字 |
|||
* |
|||
* @param str |
|||
* @return |
|||
*/ |
|||
private static boolean isStrNum(String str) { |
|||
Pattern pattern = compile("[0-9]*"); |
|||
Matcher isNum = pattern.matcher(str); |
|||
if (isNum.matches()) { |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 判断字符串是否为日期格式 |
|||
* |
|||
* @param strDate |
|||
* @return |
|||
*/ |
|||
public static boolean isStrDate(String strDate) { |
|||
Pattern pattern = compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$"); |
|||
Matcher m = pattern.matcher(strDate); |
|||
if (m.matches()) { |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
//根据身份证号判断性别
|
|||
|
|||
//根据身份证号判断性别 1男2女0未知
|
|||
public static String getGender(String idCard) { |
|||
return "1"; |
|||
String gender = "0"; |
|||
if (!IdCardNoValidatorUtils.checkIsIdCardNo(idCard)) { |
|||
return gender; |
|||
} |
|||
if (idCard.length() == 18) { |
|||
if (Integer.parseInt(idCard.substring(16).substring(0, 1)) % 2 == 0) { |
|||
gender = "2"; |
|||
} else { |
|||
gender = "1"; |
|||
} |
|||
} else if (idCard.length() == 15) { |
|||
String usex = idCard.substring(14, 15); |
|||
if (Integer.parseInt(usex) % 2 == 0) { |
|||
gender = "2"; |
|||
} else { |
|||
gender = "1"; |
|||
} |
|||
} |
|||
return gender; |
|||
} |
|||
|
|||
} |
|||
|
|||
|
Loading…
Reference in new issue