实现身份证校验
来源:互联网 发布:淘米网络私有化 编辑:程序博客网 时间:2024/05/16 15:40
简单的了解一下省份证的组成:第1~6位是地址码,第7~14是出生年月日,第15~17位是顺序码,第18位是校验码。
简单分析一下18位的含义:第1~2位行政代码,第3~4位低级行政区划分代码,第5~6位县级行政区分代码,第7~10位、第11~12位、第13~14位分别表示出生年、月、日,第15~17位是顺序码,第17位还可以判断一个人的性别,第18位是校验码。
具体详情请点击:1、第二代身份证号码编排规则 2、身份证号码编排规则及校验算法
具体校验实现代码如下:
import java.util.Arrays;import java.util.Calendar;import java.util.regex.Matcher;import java.util.regex.Pattern;public class IDCardRegex { /** * 省,直辖市代码表: { 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 static 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" }; /** * 校验省份证正确返回码 */ public static String isCardID = "true"; private static String error_cityCode = "您输入的身份证地址编码不对,请核对后再输"; private static String error_year = "您输入的年份有误,请核对后再输"; private static String error_day = "您输入的生日日期有误,请核对后再输"; private static String error_legal = "您的还没到合法年龄再等等吧!"; private static String error_cardId = "您输入的身份证有误,请核对后再输"; private static String error_cardId_num = "您输入的身份证不足18位,请核对后再输"; private static String error_failure = "您输入的身份证号可能已失效,请核对后再输"; private static String mouth_day = "(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-9])))"; // 日期判断 平年和闰年 2月的天数 private static String isCard1 = "^[1-9]\\d{5}[1-9]\\d{3}" + mouth_day + "\\d{3}([0-9]|X|x)$";// 3 比较精确的 private String isCard2 = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X|x)$";// 1 // 身份证验证 15 18 private static String isCarId3 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X|x)$";// 2 // 每位加权因子 private static int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,8, 4, 2 }; // 第18位校检码 private static String verifyCode[] = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; public static void main(String[] args) { String card1 = "44522119940201887X";// 虚拟的 String card2 = "15010219810707645X";// 虚拟的 String temp =card1; System.out.println(temp); isCard(temp); } /** * 判断省份证是否符合身份证规则 * @param card String * @return String */ public static String isCard(String card) { if ("".equals(card) || " ".equals(card)) { System.out.println(error_cardId); return error_cardId; }else if (card.length() < 18) { System.out.println(error_cardId_num); return error_cardId_num; }else if (card.length() != 18) { System.out.println(error_cardId); return error_cardId; }else if (!card.matches(isCard1)) { System.out.println(error_cardId); return error_cardId; } String IdCard2 = card.substring(0, 2);// 获取前两位地址码 if (!Arrays.asList(cityCode).contains(IdCard2)) { System.out.println(error_cityCode); return error_cityCode; } String IdCard17 = card.substring(0, 17);// 获取前17位 String idCard18 = card.substring(17, 18);// 获取校验码 String IdCardyear = card.substring(6, 10);// 年 String IdCardmouth = card.substring(10, 12);// 月 String IdCardday = card.substring(12, 14);// 日 // 获取当前年 Calendar ca = Calendar.getInstance(); int cardyear = (int) Integer.parseInt(IdCardyear); int year = ca.get(Calendar.YEAR);// 获取年份 if (year < cardyear) { // 判断年上限 System.out.println(error_year); return error_year; } else if (year - cardyear < 18) {// 判断合法年龄 System.out.println(error_legal); return error_legal; } else if (year - cardyear > 120) {// 判断人是否还在 System.out.println(error_failure); return error_failure; } int cardday = (int) Integer.parseInt(IdCardday); if ("02".equals(IdCardmouth)) { if (cardday>28 && !isRunnian(cardyear)) { System.out.println(error_day); return error_day; } } char[] cardChars = IdCard17.toCharArray(); int[] cardInt = new int[IdCard17.length()]; for (int i = 0; i < cardChars.length; i++) { cardInt[i] = Integer.parseInt(String.valueOf(cardChars[i])); } int power = getPowerSum(cardInt); String checkCode = verifyCode[power % 11]; System.out.println(checkCode); if (idCard18.equals(checkCode)) { System.out.println(isCardID); return isCardID; } System.out.println(error_cardId); return error_cardId; } /** * 判断 平闰年 * @param year * @return */ public static boolean isRunnian(int year) { return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)?true:false; } /** * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 * @param bit * @return */ private 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; }}
0 0
- 实现身份证校验
- Oracle实现身份证校验功能
- Java实现身份证校验算法
- 身份证校验原理和PHP实现
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 身份证校验
- 校验身份证
- 身份证校验
- c# 根据当前时间获取,本周,本月,本季度,月初,月末,各个时间段
- 动态获取权限
- 安装hbase分布式集群(h15\h16\h17上操作,原因是在这些机器上有zookeeper-3.4.6)
- android多线程编程之AsyncTask与Handler
- [框架整合]spring+springmvc+mybatis(2)
- 实现身份证校验
- Maven安装Nexus私服说明
- EL表达式
- MySQL数据库INNODB 表损坏修复处理过程
- display:inline、block、inline-block的区别,与下文float相关。
- Apache shiro集群实现 (一) shiro入门介绍
- (转载)使用Xcode7的Instruments检测解决iOS内存泄露
- 关于数据库主键和外键(终于弄懂啦)
- iOS音频处理技术-TAAE