Java验证身份证是否合法
- 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 java.text.ParseException;
- /**
- * @author open
- * 使用方法:调用 IDCardUtil.IDCardValidate(str)验证是否为合法的身份证.返回的是一个String,"YES" 代表合法的身份证 ,其他值代表错误信息
- *
- */
- public class IDCardUtil {
- /**
- * 验证身份证
- * @param IDStr
- * @return "YES" 代表合法的身份证 ,其他值代表错误信息
- * @throws ParseException
- */
- public static String IDCardValidate(String IDStr) {
- String tipInfo = "YES";// 记录错误信息
- String Ai = "";
- if(null == IDStr || IDStr.trim().isEmpty())
- return "身份证号码长度应该为15位或18位。";
- // 判断号码的长度 15位或18位
- if (IDStr.length() != 15 && IDStr.length() != 18) {
- tipInfo = "身份证号码长度应该为15位或18位。";
- return tipInfo;
- }
- // 18位身份证前17位位数字,如果是15位的身份证则所有号码都为数字
- if (IDStr.length() == 18) {
- Ai = IDStr.substring(0, 17);
- } else if (IDStr.length() == 15) {
- Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);
- }
- if (isNumeric(Ai) == false) {
- tipInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";
- return tipInfo;
- }
- // 判断出生年月是否有效
- String strYear = Ai.substring(6, 10);// 年份
- String strMonth = Ai.substring(10, 12);// 月份
- String strDay = Ai.substring(12, 14);// 日期
- if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
- tipInfo = "身份证出生日期无效。";
- return tipInfo;
- }
- GregorianCalendar gc = new GregorianCalendar();
- SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
- try {
- if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
- || (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
- tipInfo = "身份证生日不在有效范围。";
- return tipInfo;
- }
- } catch (NumberFormatException e) {
- e.printStackTrace();
- } catch (java.text.ParseException e) {
- e.printStackTrace();
- }
- if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
- tipInfo = "身份证月份无效";
- return tipInfo;
- }
- if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
- tipInfo = "身份证日期无效";
- return tipInfo;
- }
- // 判断地区码是否有效
- Hashtable areacode = GetAreaCode();
- // 如果身份证前两位的地区码不在Hashtable,则地区码有误
- if (areacode.get(Ai.substring(0, 2)) == null) {
- tipInfo = "身份证地区编码错误。";
- return tipInfo;
- }
- if (isVarifyCode(Ai, IDStr) == false) {
- tipInfo = "身份证校验码无效,不是合法的身份证号码";
- return tipInfo;
- }
- return tipInfo;
- }
- /*
- * 判断第18位校验码是否正确 第18位校验码的计算方式: 1. 对前17位数字本体码加权求和 公式为:S = Sum(Ai * Wi), i =
- * 0, ... , 16 其中Ai表示第i个位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4
- * 2 1 6 3 7 9 10 5 8 4 2 2. 用11对计算结果取模 Y = mod(S, 11) 3. 根据模的值得到对应的校验码
- * 对应关系为: Y值: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2
- */
- private static boolean isVarifyCode(String Ai, String IDStr) {
- String[] VarifyCode = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
- String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2" };
- int sum = 0;
- for (int i = 0; i < 17; i++) {
- sum = sum + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]);
- }
- int modValue = sum % 11;
- String strVerifyCode = VarifyCode[modValue];
- Ai = Ai + strVerifyCode;
- if (IDStr.length() == 18) {
- if (Ai.equals(IDStr) == false) {
- return false;
- }
- }
- return true;
- }
- /**
- * 将所有地址编码保存在一个Hashtable中
- *
- * @return Hashtable 对象
- */
- private static Hashtable GetAreaCode() {
- Hashtable hashtable = new Hashtable();
- 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;
- }
- /**
- * 判断字符串是否为数字,0-9重复0次或者多次
- *
- * @param strnum
- * @return
- */
- private static boolean isNumeric(String strnum) {
- Pattern pattern = Pattern.compile("[0-9]*");
- Matcher isNum = pattern.matcher(strnum);
- if (isNum.matches()) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 功能:判断字符串出生日期是否符合正则表达式:包括年月日,闰年、平年和每月31天、30天和闰月的28天或者29天
- *
- * @param string
- * @return
- */
- public static boolean isDate(String strDate) {
- Pattern 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]))))))?$");
- Matcher m = pattern.matcher(strDate);
- if (m.matches()) {
- return true;
- } else {
- return false;
- }
- }
- }
原文地址:https://blog.csdn.net/the_thinnest/article/details/78226509
Java验证身份证是否合法的更多相关文章
- JAVA验证身份证号码是否合法
package com.chauvet.utils; import java.text.ParseException; import java.text.SimpleDateFormat; impor ...
- JAVA验证身份证号码是否正确
package com.IdCard; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.D ...
- java 验证手机号是否合法
一.通用工具类编写 /** * @project * @Description * @Author songwp * @Date 2022/9/15 17:06 * @Version 1.0.0 ** ...
- java验证手机号码是否合法
公司开发新功能须要验证手机号码,遂自己写了个出来,暂仅仅支持中国大陆手机号验证.如有不妥之处,还望大家指教,感激不尽! /** * 验证是否是正确合法的手机号码 * * @param telephon ...
- JAVA验证身份证格式及合法性
旅游电子商务中,预订酒店或订购门票时会以身份证作为消费凭证,为了防止客户误填身份证带来不必要麻烦,需要验证码格式及合法性,代码如下: /** * 判断身份证格式 * * @param idNum * ...
- java验证身份证合理性
package com.tiantian.util; import java.util.Calendar;import java.util.HashMap;import java.util.Map;i ...
- java验证身份证号码是否有效源代码 wn25的头像 wn25 23 2015-01-04 20:09 6 基本信息 Java × 1 浏览
原文:http://www.open-open.com/code/view/1420373343171 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 ...
- java验证身份证号码是否有效源代码
原文:http://www.open-open.com/code/view/1420373343171 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 ...
- java 验证身份证号
随机推荐
- nginx - 反向代理 - 配置文件 header - 日志log格式
server { listen ; server_name paas.service.consul; client_max_body_size 512m; access_log /data/bkdat ...
- [转帖]etcd 在超大规模数据场景下的性能优化
etcd 在超大规模数据场景下的性能优化 阿里系统软件技术 2019-05-27 09:13:17 本文共5419个字,预计阅读需要14分钟. http://www.itpub.net/2019/ ...
- 水晶报表和rdlc报表传入参数筛选
在使用报表向客户展示结果数据时,实时的在报表中显示某些特定的数据是必需的,如:显示的部门.打印的日期等.本文只简单的演示向报表内传入一个字符值. 以下是设计好报表之后传入参数的具体操作 一.首先是水晶 ...
- JAVA基础--JAVA API常见对象(字符串&缓冲区)
一. String 类型 1. String类引入 第二天学习过Java中的常量: 常量的分类: 数值型常量:整数,小数(浮点数) 字符型常量:使用单引号引用的数据 字符串常量:使用双引号引用 ...
- SYN攻击源码
一.linux下源代码实现/* syn flood by wqfhenanxc. * random soruce ip and random sourec port. * use #include & ...
- 蚂蚁分类信息商家发布文章、商品外链及远程图片自动添加nofollow属性
蚂蚁商户发布文章.商品是可以添加外链或者直接用外部图片,但是这对分类网站运营不利. 所以要对外链进行过滤,演示网站保洁,蚂蚁分类的源码. 下面就说下怎么处理自动给外链自动加上nofollow属性. 1 ...
- Redis 高可用之哨兵模式(二)
上一篇实际操作过程中遇到两个问题 问题一:虽然运行了3个sentinel容器,实际上只有一个sentinel运行 问题出现的原因很简单,三个sentinel用的是同一个挂载配置文件,容器内部的更改直接 ...
- Select2的远程数据操作
一.概述 如果下拉列表框中的内容太多,最好是使用Select2的远程数据进行筛选. 二.参考文献 https://select2.github.io/examples.html#data-ajax h ...
- sql server update语句
update语句 --Update 语句用于修改表中的数据 语法:update 表名称 set 列名称 = 新值 where 列名称 = 某值 --更新某一行的若干列,set字句中用','隔开
- JAVA高级语法
高级语法 第三章:面向对象和高级语法 实例化: 不实例化,就是一个空指针 注意,声明和实例化是两个过程.声明的过程是不分配内存空间的,只有实例化才会真正分配空间 对变量的分类 实例变量只有实例化之后才 ...