我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java身份证验证方法实例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java身份证验证方法实例详解

Java身份证验证方法实例详解

身份证号码验证 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,

      八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码(前六位数)

      表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 3、出生日期码(第七位至十四位) 

    表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 4、顺序码(第十五位至十七位)

     表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号, 顺序码的奇数分配给男性,偶数分配给女性。 5、校验码(第十八位数)

      (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4

     2 (2)计算模 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

实例代码:

import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.GregorianCalendar;import java.util.Hashtable;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class IDCard {        public static String IDCardValidate(String IDStr) {    String errorInfo = "";// 记录错误信息    String[] ValCodeArr = { "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" };    String Ai = "";    // ================ 号码的长度 15位或18位 ================    if (IDStr.length() != 15 && IDStr.length() != 18) {      errorInfo = "身份证号码长度应该为15位或18位。";      return errorInfo;    }    // =======================(end)========================    // ================ 数字 除最后以为都为数字 ================    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) {      errorInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";      return errorInfo;    }    // =======================(end)========================    // ================ 出生年月是否有效 ================    String strYear = Ai.substring(6, 10);// 年份    String strMonth = Ai.substring(10, 12);// 月份    String strDay = Ai.substring(12, 14);// 月份    if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {      errorInfo = "身份证生日无效。";      return errorInfo;    }    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) {        errorInfo = "身份证生日不在有效范围。";        return errorInfo;      }    } catch (NumberFormatException e) {      e.printStackTrace();    } catch (java.text.ParseException e) {      e.printStackTrace();    }    if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {      errorInfo = "身份证月份无效";      return errorInfo;    }    if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {      errorInfo = "身份证日期无效";      return errorInfo;    }    // =====================(end)=====================    // ================ 地区码时候有效 ================    Hashtable<?, ?> h = GetAreaCode();    if (h.get(Ai.substring(0, 2)) == null) {      errorInfo = "身份证地区编码错误。";      return errorInfo;    }    // ==============================================    // ================ 判断最后一位的值 ================    int TotalmulAiWi = 0;    for (int i = 0; i < 17; i++) {      TotalmulAiWi = TotalmulAiWi          + Integer.parseInt(String.valueOf(Ai.charAt(i)))          * Integer.parseInt(Wi[i]);    }    int modValue = TotalmulAiWi % 11;    String strVerifyCode = ValCodeArr[modValue];    Ai = Ai + strVerifyCode;    if (IDStr.length() == 18) {      if (Ai.equals(IDStr) == false) {        errorInfo = "身份证无效,不是合法的身份证号码";        return errorInfo;      }    } else {      return "YES";    }    // =====================(end)=====================    return "YES";  }    private static Hashtable<String, String> GetAreaCode() {    Hashtable<String, String> hashtable = new Hashtable<String, String>();    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;  }    private static boolean isNumeric(String str) {    Pattern pattern = Pattern.compile("[0-9]*");    Matcher isNum = pattern.matcher(str);    if (isNum.matches()) {      return true;    } else {      return false;    }  }    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]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?{1}quot;);    Matcher m = pattern.matcher(strDate);    if (m.matches()) {      return true;    } else {      return false;    }  }    @SuppressWarnings("static-access")  public static void main(String[] args) {    // String IDCardNum="210102820826411";    // String IDCardNum="210102198208264114";    while (true) {      Scanner input = new Scanner(System.in);      String n = input.nextLine();      if (n.equals("N") || n.equals("n")) {        break;      }      String IDCardNum = input.nextLine();      IDCard cc = new IDCard();      System.out.println(cc.IDCardValidate(IDCardNum));    }    // System.out.println(cc.isDate("1996-02-29"));  }  }

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java身份证验证方法实例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java身份证验证方法实例详解

Java身份证验证方法实例详解身份证号码验证 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码, 八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码
2023-05-31

Java如何实现身份证号码验证

小编给大家分享一下Java如何实现身份证号码验证,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:package xxx;/** * Created by
2023-05-31

将15位身份证补全为18位身份证的算法示例详解

前言最近在参与一个银行项目-某银行安防系统-反洗钱需求的开发,银行项目的离不开身份证号码,身份证号码作为我国公民的唯一标识,有这非同寻常的意义,由于业务的要求15位的身份证号码无法命中,所以需要补全为18位,一开始自己想着加个年份的前两位,
2023-05-31

Python实现身份证号码验证的示例代码

本文介绍了使用Python验证身份证号码的示例代码。代码通过正则表达式匹配格式,计算校验位,并验证校验位来实现验证。利用正则表达式简化了格式验证,并使用列表存储权重和校验位值,便于扩展和维护。此代码适用于Python3.6或更高版本,需定期更新以适应格式变化。
Python实现身份证号码验证的示例代码
2024-04-02

C#实现身份证验证功能的示例代码

这篇文章主要为大家详细介绍了如何利用C#实现身份证验证功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-20

NodeJS使用JWT跨域身份验证方案详解

JWT是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,其组成部分为Header、Payload、Signature.Payload部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串,Header和Signature是安全性相关的部分,只是为了保证token的安全性
2023-02-06

Java JWT如何实现跨域身份验证

今天小编给大家分享一下Java JWT如何实现跨域身份验证的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、JWT简介JWT
2023-06-26

利用Java怎么实现一个验证身份证功能

这期内容当中小编将会给大家带来有关利用Java怎么实现一个验证身份证功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体如下:package org.cxy.csdn.example;import ja
2023-05-31

Node.js通过身份证号验证年龄、出生日期与性别方法示例

前言 大家如果想要知道自己的年龄,出生日期和性别,或者是别人的,给我个身份证号,我就可以知道,其实很简单的,看下面代码。 node.js实现static validateIdNumberToAgeYear(str){let date = n
2022-06-04

阿里云服务器身份验证异常的解决方法

阿里云服务器是一款性能稳定、安全可靠的云计算产品。然而,有时在使用过程中可能会遇到一些问题,如身份验证异常。本文将详细介绍如何解决阿里云服务器身份验证异常的问题。阿里云服务器身份验证异常是指在使用阿里云服务器时,无法进行正常的身份验证操作,导致无法正常使用服务器。这可能是因为服务器配置错误、网络问题、服务器端问题
阿里云服务器身份验证异常的解决方法
2023-11-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录