身份证号码校验java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;/*** 身份证校验*/
@Configuration
public class IDCardCheck {/*** <pre>* 省、直辖市代码表:* 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 : 国外* </pre>*/final static String CITY_CODE[] = {"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"};/*** 效验码*/final static char[] PARITYBIT = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};/*** 加权因子* Math.pow(2, i - 1) % 11*/final static int[] POWER = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};/*** 身份证验证** @param id 号码内容* @return 是否有效*/public final static boolean isValid(String id) {if (id == null)return false;int len = id.length();if (len != 15 && len != 18)return false;//校验区位码if (!validCityCode(id.substring(0, 2)))return false;//校验生日if (!validDate(id))return false;if (len == 15)return true;//校验位数return validParityBit(id);}private static boolean validParityBit(String id) {char[] cs = id.toUpperCase().toCharArray();int power = 0;for (int i = 0; i < cs.length; i++) {//最后一位可以是Xif (i == cs.length - 1 && cs[i] == 'X')break;// 非数字if (cs[i] < '0' || cs[i] > '9')return false;// 加权求和if (i < cs.length - 1) {power += (cs[i] - '0') * POWER[i];}}return PARITYBIT[power % 11] == cs[cs.length - 1];}private static boolean validDate(String id) {try {String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Date birthDate = sdf.parse(birth);if (!birth.equals(sdf.format(birthDate)))return false;} catch (ParseException e) {return false;}return true;}private static boolean validCityCode(String cityCode) {for (String code : CITY_CODE) {if (code.equals(cityCode))return true;}return false;}/*** 将15位的身份证转成18位身份证** @param id* @return*/final public static String id15To18(String id) {if (id == null || id.length() != 15)return null;if (!isValid(id))return null;String id17 = id.substring(0, 6) + "19" + id.substring(6);int power = 0;char[] cs = id17.toCharArray();for (int i = 0; i < cs.length; i++) {power += (cs[i] - '0') * POWER[i];}// 将前17位与第18位校验码拼接return id17 + String.valueOf(PARITYBIT[power % 11]);}/*** 生成随机整数* <p>** @param min* @param max* @return*/public static int rand(int min, int max) {Random random = new Random();return random.nextInt(max + 1) % (max - min + 1) + min;}public final static String generateID() {// 地址码String body = CITY_CODE[rand(0, CITY_CODE.length - 1)] + "0101";// 出生年String y = String.valueOf(rand(1950, Calendar.getInstance().get(Calendar.YEAR)));String m = String.valueOf(rand(1, 12));if (m.length() == 1)m = "0" + m;String d = String.valueOf(rand(1, 28));if (d.length() == 1)d = "0" + d;String idx = String.valueOf(rand(1, 999));if (idx.length() == 1)idx = "00" + idx;else if (idx.length() == 2)idx = "0" + idx;body += y + m + d + idx;// 累加body部分与位置加权的积int power = 0;char[] cs = body.toCharArray();for (int i = 0; i < cs.length; i++) {power += (cs[i] - '0') * POWER[i];}// 得出校验码return body + String.valueOf(PARITYBIT[power % 11]);}
}
@Resourceprivate IDCardCheck idCardCheck;@Testpublic void testSearchAkmByIdCardNo(){System.out.println(idCardCheck.isValid("自己的身份证号码"));}
身份证号码校验java相关推荐
- 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位
使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...
- java版本身份证号码校验与卫语句
最近在公司做项目时,有一个小功能点就是身份证号码校验,即判断是否是合理的身份证号码.不想重复造轮子,想着公司的一些基础组件可能有这个功能,一找还真有,原作者代码逻辑应该是正确的,但是风格有点呵呵了,各 ...
- 【转载】 身份证号码校验(15位和18位都可以)
转载自: 开源中国社区 面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...
- 中国公民身份证号码校验
中国公民身份证号码校验 上图可看出18位位身份证每一部分表示的意义. 图为随机生成身份号码,四川省 乐山市 井研县 1981年12月28日生 这里主要讲解最后一位校验码的验证 校验码主要是由前面17位 ...
- JS身份证号码校验大全史上最全号称公安局安全监测
身份证号码校验 function testid(id) {// 1 "验证通过!", 0 //校验不通过 // id为身份证号码var format = /^(([1][1-5]) ...
- JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别
目录 1.JS身份证号码校验 2.JS根据身份证号码获取出生年月日 3.JS根据出生年月日获取年龄 4.JS根据身份证号码获取性别 1.JS身份证号码校验 /*** 身份证校验** @export* ...
- validate格式校验之身份证号码校验
//校验身份证号码 function isIdCardNo(num) { var factorArr = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5 ...
- vue身份证号码校验
一.vue身份证号码校验? let checkRegNo = (rule,value,callback) => { setTimeout(() => { const ...
- 身份证号码校验(JavaScript)
/*** 身份证号码校验* 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X*/ function checkIdCard(idCard){v ...
最新文章
- Atitit 知识图谱的数据来源
- R语言Kmeans聚类、抽取聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(ASW)为Kmeans选择最优的聚类K值、并与层次聚类的最优K值进行比较
- VS2002 与 IIS6.0的一个bug
- nmon_analyser 在Aix平台的使用方法
- kubernetes1.8.4 安装指南 -- 11. 安装kubernetes dashboard
- C语言——冒泡排序法
- Docker : Error response from daemon: Get https://docker.elastic.co/v2/: net/http: TLS handshake time
- C# 14位日期型字符串yyyyMMddHHmmss转变为日期格式
- 整理一下CCF推荐期刊会议(A类)
- matlab幅度归一化,matlab归一化方法
- 微信公众号唤起微信支付
- 使用uniapp开发微信小程序的人脸采集功能/人脸识别功能
- 485集线器,485Hub、485分配器、485共享器、三级浪涌保护,485星型接法设备 1拖4...
- 【LeetCode】643. 子数组最大平均数 I
- 【PTA-训练day6】L2-016 愿天下有情人都是失散多年的兄妹+ L1-011 帅到没朋友
- 计算机如何接两个屏幕,笔记本连接两个显示器的步骤_笔记本电脑怎么外接两个显示器做分屏-win7之家...
- Git 修改已提交的 commit 信息
- IDEA中如何引入jama.jar包
- 【Linux学习笔记】Linux下安装Libreoffice
- 输入10个数,将最大的数字输出;