package com.yt.eos.common.enumclass;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;import org.apache.commons.lang3.StringUtils;/*** 大陆身份证号码验证* 15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。* 18位身份证号码* 第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。* @author tyg* @date   2019年5月8日下午5:22:02*/
public enum IdCardEnum {/***  省,直辖市代码表*/北京(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),;private int code;// 每位加权因子private static int[] POWER = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };private IdCardEnum(int code) {this.code = code;}public int getCode() {return code;}/*** 验证所有的身份证的合法性* @param idCard* @return* @return boolean* @author tyg* @date   2019年5月8日下午5:49:44*/public static boolean isValidatedIdCard(String idCard) {// 十位数的是台湾同胞的身份证if (idCard.length() == 10) {return TaiWanIdCardEnum.isTaiWanIdCard(idCard);}// 如果是15位是老身份证,先转成18位if (idCard.length() == 15) {idCard = convertIdcarBy15bit(idCard);}return isValidate18Idcard(idCard);}/*** 判断18位身份证的合法性* 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。* 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。* * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。* 1.前1、2位数字表示:所在省份的代码; * 2.第3、4位数字表示:所在城市的代码; * 3.第5、6位数字表示:所在区县的代码;* 4.第7~14位数字表示:出生年、月、日; * 5.第15、16位数字表示:所在地的派出所的代码;* 6.第17位数字表示性别:奇数表示男性,偶数表示女性;* 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。* * 第十八位数字(校验码)的计算方法为: * 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。* @param idCard* @return* @return boolean* @author tyg* @date   2019年5月8日下午5:32:31*/public static boolean isValidate18Idcard(String idCard) {// 非18位为假if (StringUtils.isBlank(idCard) || idCard.length() != 18) {return false;}// 获取前17位String idCard17 = idCard.substring(0, 17);// 获取第18位String lastNumber = idCard.substring(17, 18).toLowerCase();// 是否都为数字if (!idCard17.matches("^[0-9]*$")) {return false;}char[] c = idCard17.toCharArray();// 将字符数组转为整型数组int[] bit = converCharToInt(c);// 将身份证的每位和对应位的加权因子相乘之后,再得到和值int sum17 = getPowerSum(bit);// 将和值与11取模得到余数进行校验码判断String checkCode = getCheckCodeBySum(sum17);// 将身份证的第18位与算出来的校码进行匹配,不相等就是非法身份证if (null == checkCode || !lastNumber.equalsIgnoreCase(checkCode)) {return false;}return true;}/*** 将15位的身份证转成18位身份证* @param idCard* @return* @return String* @author tyg* @date   2019年5月8日下午5:25:49*/public static String convertIdcarBy15bit(String idCard) {String idcard17 = null;// 非15位身份证if (StringUtils.isBlank(idCard) || idCard.length() != 15) {return null;}if (idCard.matches("^[0-9]*$")) {// 获取出生年月日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();// 将字符数组转为整型数组int[] bit = converCharToInt(c);int sum17 = getPowerSum(bit);// 获取和值与11取模得到余数进行校验码String checkCode = getCheckCodeBySum(sum17);// 获取不到校验位if (null == checkCode) {return null;}// 将前17位与第18位校验码拼接idcard17 += checkCode;} else { // 身份证包含数字return null;}return idcard17;}/*** 将和值与11取模得到余数进行校验码判断* @param sum17* @return* @return String* @author tyg* @date   2019年5月8日下午5:30:14*/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* @throws NumberFormatException* @return int[]* @author tyg* @date   2019年5月8日下午5:29:57*/public static int[] converCharToInt(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;}/*** 将身份证的每位和对应位的加权因子相乘之后,再得到和值* @param bit* @return* @return int* @author tyg* @date   2019年5月8日下午5:31:09*/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;}public static void main(String[] args) throws Exception {boolean vali = isValidatedIdCard("510623198207237001");System.out.println(vali ? "身份证号码合法" : "身份证号码不合法!");}
}

java对大陆身份证号码验证相关推荐

  1. 新旧身份证合法性验证及相互转换算法(三):Java身份证号码验证及将15位转换18位

    package test; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 身份证号码验证 * */ pub ...

  2. java对台湾同胞身份证号码验证

    package com.yt.eos.common.enumclass;import org.apache.commons.lang3.StringUtils;/*** 台湾同胞身份证号码验证* @a ...

  3. Android身份证号码验证

    最近用到身份证号码验证,在网上看了些资料,写了些方法记录下: 文章迁至:Java/Android通用身份证号验证 public class IDCardValidate {public static ...

  4. 15/18位身份证号码验证

    15/18位身份证号码验证 在做身份证验证之前你得明确身份证号的组成. 首先我告诉你,18位身份证号码后面的字母只有"X"这一个.(X是罗马数字的10,用X来代替10,可以保证您的 ...

  5. 身份证号码验证验证 js_验证我的身份。 如果你可以的话…

    身份证号码验证验证 js I frequently hear questions like "How to implement authentication in an Android ap ...

  6. javascript身份证号码验证函数支持带x

    //--身份证号码验证-支持新的带x身份证 function isIdCardNo(num)  {     var factorArr = new Array(7,9,10,5,8,4,2,1,6,3 ...

  7. 身份证号码验证-支持新的带x身份证

    //--身份证号码验证-支持新的带x身份证 function isIdCardNo(num)  {     var factorArr = new Array(7,9,10,5,8,4,2,1,6,3 ...

  8. C#实现身份证号码验证的方法

    本文实例讲述了C#实现身份证号码验证的方法.分享给大家供大家参考.具体实现方法如下: 随着现在互联网的发展,越来越多的注册用户的地方都用到了身份证,那么对于输入的身份证如何验证呢?看下面的代码,其实很 ...

  9. .net身份证号码验证

    using System; /// <summary>/// Summary description for IDCardValid/// </summary>public c ...

  10. 正则实现二代身份证号码验证详解

    Start 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 一: IdCodeValid:f ...

最新文章

  1. 刚学GDI+和.Net WinForm控件开发时做的Training Project
  2. linux java程序控制台日志输出
  3. 我的第一个.NET Core App Windows系统
  4. 时间序列研(part2)--相关系数与自相关函数
  5. ASP.NET控件开发基础5
  6. php主机安装v2,RackTables 安装教程Installation GuideV2
  7. Spring MVC Controller与jquery ajax请求处理json
  8. 黄文俊:Serverless小程序后端技术分享
  9. 使用MinGW编译Psycopg2
  10. JAVA实现inotify一样的功能_WPF实现INotifyPropertyChanged
  11. 2020品牌情商指数报告
  12. math java 计算_Java中的数学计算函数汇总
  13. Cobbler实现自动化安装操作系统
  14. 覆盖和覆盖D2D通信网络的传输容量分析(Matlab代码实现)
  15. Simple---强大的XOM工具
  16. 服务器上文件不能重命名,服务器文件重命名
  17. c++中关于二分查找的函数
  18. 统计局解读1月制造业采购经理指数:服务业回升明显
  19. win8系统 ps不能直接拖入图片的问题!解决方法
  20. 天然气故障代码大全_美的燃气热水器故障代码大全

热门文章

  1. Profinet协议基础知识(一)
  2. python简单的购物程序代码打折_Python进阶之路——简单购物代码
  3. Multisim基础 调出面包板
  4. uniapp微信公众号跳转小程序(vue项目)
  5. Git常见问题:fatal: Unable to create index.lock File exists 错误的解决办法
  6. linux云服务器,Tomcat服务器常见 The value for the useBean class attribute is invalid 错误
  7. SpringBoot集成JApiDocs实现自动生成接口文档
  8. 企业开票信息税号查询API接口服务
  9. Java流处理之转换编码的转换流
  10. 在method方法被调用之后,仅打印出a=100,b=200,请写出method方法的代码