import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.regex.Pattern;/*** 身份证格式校验工具类**/
public class IdCardValidatorUtil {/*** 省,直辖市代码表: { 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",* 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",* 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",* 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",* 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",* 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}*/protected String codeAndCity[][] = {{"11", "北京"}, {"12", "天津"},{"13", "河北"}, {"14", "山西"}, {"15", "内蒙古"}, {"21", "辽宁"},{"22", "吉林"}, {"23", "黑龙江"}, {"31", "上海"}, {"32", "江苏"},{"33", "浙江"}, {"34", "安徽"}, {"35", "福建"}, {"36", "江西"},{"37", "山东"}, {"41", "河南"}, {"42", "湖北"}, {"43", "湖南"},{"44", "广东"}, {"45", "广西"}, {"46", "海南"}, {"50", "重庆"},{"51", "四川"}, {"52", "贵州"}, {"53", "云南"}, {"54", "西藏"},{"61", "陕西"}, {"62", "甘肃"}, {"63", "青海"}, {"64", "宁夏"},{"65", "新疆"}, {"71", "台湾"}, {"81", "香港"}, {"82", "澳门"},{"91", "国外"}};private String cityCode[] = {"11", "12", "13", "14", "15", "21", "22","23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43","44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63","64", "65", "71", "81", "82", "91"};// 每位加权因子private static int power[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};// 第18位校检码private String verifyCode[] = {"1", "0", "X", "9", "8", "7", "6", "5","4", "3", "2"};/*** 验证所有的身份证的合法性** @param idcard* @return*/public boolean isValidatedAllIdCard(String idcard) {if (idcard.length() == 15) {idcard = convertIdCardBy15bit(idcard);}return isValidate18IdCard(idcard);}/*** <p>* 判断18位身份证的合法性* </p>* 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。* 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。* <p>* 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。* </p>* <p>* 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码;* 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码;* 6.第17位数字表示性别:奇数表示男性,偶数表示女性;* 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。* </p>* <p>* 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4* 2 1 6 3 7 9 10 5 8 4 2* </p>* <p>* 2.将这17位数字和系数相乘的结果相加。* </p>* <p>* 3.用加出来和除以11,看余数是多少?* </p>* 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3* 2。* <p>* 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。* </p>** @param idcard* @return*/public static boolean isValidate18IdCard(String idcard) {// 非18位为假if (idcard.length() != 18) {return false;}// 获取前17位String idcard17 = idcard.substring(0, 17);// 获取第18位String idcard18Code = idcard.substring(17, 18);char c[] = null;String checkCode = "";// 是否都为数字if (isDigital(idcard17)) {c = idcard17.toCharArray();} else {return false;}if (null != c) {int bit[] = new int[idcard17.length()];bit = convertCharToInt(c);int sum17 = 0;sum17 = getPowerSum(bit);// 将和值与11取模得到余数进行校验码判断checkCode = getCheckCodeBySum(sum17);if (null == checkCode) {return false;}// 将身份证的第18位与算出来的校码进行匹配,不相等就为假if (!idcard18Code.equalsIgnoreCase(checkCode)) {return false;}}return true;}/*** 验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。** @param idcard* @return*/public boolean isValidate15Idcard(String idcard) {// 非15位为假if (idcard.length() != 15) {return false;}// 是否全都为数字if (isDigital(idcard)) {String provinceid = idcard.substring(0, 2);String birthday = idcard.substring(6, 12);int year = Integer.parseInt(idcard.substring(6, 8));int month = Integer.parseInt(idcard.substring(8, 10));int day = Integer.parseInt(idcard.substring(10, 12));// 判断是否为合法的省份boolean flag = false;for (String id : cityCode) {if (id.equals(provinceid)) {flag = true;break;}}if (!flag) {return false;}// 该身份证生出日期在当前日期之后时为假Date birthdate = null;try {birthdate = new SimpleDateFormat("yyMMdd").parse(birthday);} catch (ParseException e) {e.printStackTrace();}if (birthdate == null || new Date().before(birthdate)) {return false;}// 判断是否为合法的年份GregorianCalendar curDay = new GregorianCalendar();int curYear = curDay.get(Calendar.YEAR);int year2bit = Integer.parseInt(String.valueOf(curYear).substring(2));// 判断该年份的两位表示法,小于50的和大于当前年份的,为假if ((year < 50 && year > year2bit)) {return false;}// 判断是否为合法的月份if (month < 1 || month > 12) {return false;}// 判断是否为合法的日期boolean mflag = false;curDay.setTime(birthdate); // 将该身份证的出生日期赋于对象curDayswitch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:mflag = (day >= 1 && day <= 31);break;case 2: // 公历的2月非闰年有28天,闰年的2月是29天。if (curDay.isLeapYear(curDay.get(Calendar.YEAR))) {mflag = (day >= 1 && day <= 29);} else {mflag = (day >= 1 && day <= 28);}break;case 4:case 6:case 9:case 11:mflag = (day >= 1 && day <= 30);break;}if (!mflag) {return false;}} else {return false;}return true;}/*** 将15位的身份证转成18位身份证** @param idcard* @return*/public String convertIdCardBy15bit(String idcard) {String idcard17 = null;// 非15位身份证if (idcard.length() != 15) {return null;}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 cday = Calendar.getInstance();cday.setTime(birthdate);String year = String.valueOf(cday.get(Calendar.YEAR));idcard17 = idcard.substring(0, 6) + year + idcard.substring(8);char c[] = idcard17.toCharArray();String checkCode = "";if (null != c) {int bit[] = new int[idcard17.length()];// 将字符数组转为整型数组bit = convertCharToInt(c);int sum17 = 0;sum17 = getPowerSum(bit);// 获取和值与11取模得到余数进行校验码checkCode = getCheckCodeBySum(sum17);// 获取不到校验位if (null == checkCode) {return null;}// 将前17位与第18位校验码拼接idcard17 += checkCode;}} else { // 身份证包含数字return null;}return idcard17;}/*** 15位和18位身份证号码的基本数字和位数验校** @param idcard* @return*/public boolean isIdcard(String idcard) {return idcard == null || "".equals(idcard) ? false : Pattern.matches("(^\\d{15}$)|(\\d{17}(?:\\d|x|X)$)", idcard);}/*** 15位身份证号码的基本数字和位数验校** @param idcard* @return*/public boolean is15Idcard(String idcard) {return idcard == null || "".equals(idcard) ? false : Pattern.matches("^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$",idcard);}/*** 18位身份证号码的基本数字和位数验校** @param idcard* @return*/public boolean is18Idcard(String idcard) {return Pattern.matches("^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$",idcard);}/*** 数字验证** @param str* @return*/public static boolean isDigital(String str) {return str == null || "".equals(str) ? false : str.matches("^[0-9]*$");}/*** 将身份证的每位和对应位的加权因子相乘之后,再得到和值** @param bit* @return*/public static int getPowerSum(int[] bit) {int sum = 0;if (power.length != bit.length) {return sum;}for (int i = 0; i < bit.length; i++) {for (int j = 0; j < power.length; j++) {if (i == j) {sum = sum + bit[i] * power[j];}}}return sum;}/*** 将和值与11取模得到余数进行校验码判断** @param sum17* @param sum17* @return 校验位*/public static String getCheckCodeBySum(int sum17) {String checkCode = null;switch (sum17 % 11) {case 10:checkCode = "2";break;case 9:checkCode = "3";break;case 8:checkCode = "4";break;case 7:checkCode = "5";break;case 6:checkCode = "6";break;case 5:checkCode = "7";break;case 4:checkCode = "8";break;case 3:checkCode = "9";break;case 2:checkCode = "x";break;case 1:checkCode = "0";break;case 0:checkCode = "1";break;}return checkCode;}/*** 将字符数组转为整型数组** @param c* @return* @throws NumberFormatException*/public static int[] convertCharToInt(char[] c) throws NumberFormatException {int[] a = new int[c.length];int k = 0;for (char temp : c) {a[k++] = Integer.parseInt(String.valueOf(temp));}return a;}
}

java身份证号码校验工具类相关推荐

  1. java 身份证号码校验工具类

    import org.slf4j.Logger; import org.slf4j.LoggerFactory;/*** 校验身份证*/ public class IdCardUtil {privat ...

  2. Java 身份证号码验证工具类

    package cn.hlq.test;import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  3. java 身份证正则校验工具类

    import java.text.SimpleDateFormat; import java.util.Date;/** * 验证身份证号码 身份证号码, 可以解析身份证号码的各个字段, * 以及验证 ...

  4. javaScript身份证号码校验工具类IdCardUtils

    //IdCardUtils命名空间IdCardUtils = {//区域areas: {110000: '北京市',110100: '市辖区',110101: '东城区',110102: '西城区', ...

  5. Java后端手机号校验工具类

    package com.cn.test.tset;import org.apache.commons.lang.StringUtils;import java.util.regex.Pattern;/ ...

  6. java简单密码校验工具类及弱密码说明

    1.连续性弱密码校验 描述:密码连续性校验是指123456,654321,abcdefg,gfedcba等数字和字母顺序是连续的字符称之为连续性弱密码. 校验方式:PassWordUtil.java通 ...

  7. JAVA --银行卡正则校验工具类

    package com.allinpay.utils;import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; im ...

  8. Java身份证校验工具类

    Java身份证校验工具类 工作中经常会涉及到身份证的校验,而且需求不同,有的需要校验最后一位校验位,有的不需要,这里参考了几篇文章及自己工作中用到的情况写了一个工具类.记录一下,菜鸟一个,大佬勿喷. ...

  9. 组织机构代码和统一社会信用代码校验规则以及java校验工具类

    组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...

最新文章

  1. C++下的DLL编程入门
  2. 【IT资讯】全新编程语言V发布
  3. (素材源代码) 猫猫学iOS 之UIDynamic重力、弹性碰撞吸附等现象牛逼Demo
  4. php+js实现弹幕,jquery.barrager.js-专业的网页弹幕插件
  5. android初步ui线程案例,android – 它是一个bug还是一个功能?在某些情况下,可以从未在UI线程上运行的任务访问UI线程...
  6. android+大富翁+局域网,【图片】大富翁6局域网(LAN)多人联机教程(求精)_大富翁吧_百度贴吧...
  7. 利用SQL建立数据库
  8. React taro 微信小程序上传文件 多个文件上传
  9. Java 2.1(将摄氏温度转换为华氏温度)编写程序,从控制台读入double型摄氏温度,然后将其转换为华氏温度,并显示结果。
  10. 【PyTorch】深度学习实战之PyTorch实现线性回归
  11. python基础训练—列表
  12. Android 关于佳博和汉印蓝牙热敏打印机开发
  13. python speech语言模块安装
  14. 设备驱动中的并发控制
  15. Numpy API 速查表
  16. 程序猿解决BUG之总结
  17. html 文字右侧属性,HTML标签及属性大全
  18. 亲历5.12汶川大地震----杨大伟作为志愿者14日奔赴汶川等地抗震救灾
  19. 一程序员被网恋女友诈骗1.8万,警方调查“女友”后发现竟是...
  20. 学校员工管理系统流程图以及项目源码(c++超详细)

热门文章

  1. Trapcode Particular 5 - Designer
  2. 8051单片机外扩ROM
  3. 支持webdav的php网盘,百度网盘支持WebDAV吗?
  4. RationalDMIS 2020 位置度公差显示XYZ误差
  5. 从tushare中提取股票交易数据并进行聚类分析
  6. 基于Android的聊天软件的设计与实现-一个聊天软件开发起来没那么难不是?
  7. 基于javaweb+SSM的大学生兼职论坛(java+SSM+JSP+jQuery+Layui+mysql)
  8. 基于IPMI的FRU
  9. 【机器学习】京东用户购买意向预测-数据集介绍和数据清洗 - 1
  10. express 的安全中间件 helmet 简介