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

前言

最近在参与一个银行项目-某银行安防系统-反洗钱需求的开发,银行项目的离不开身份证号码,身份证号码作为我国公民的唯一标识,有这非同寻常的意义,由于业务的要求15位的身份证号码无法命中,所以需要补全为18位,一开始自己想着加个年份的前两位,后面再加个X不就行了嘛,后来代码写不下去了,上网查了资料,才知道自己想的是多么天真,还是比较复杂的,折腾了一下午终于有了眉目。

一、15位身份证和18位身份证号码结构介绍

要进行身份证号码的验证,首先需要了解我国身份证号码的编码规则。我国身份证号码多由若干位数字或者数字与字母混合组成。早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,后来考虑到千年虫问题,因为15位的身份证号码只能为1900年1月1日到1999年12月31日出生的人编号,所以又增加了18位身份证号码编号规则。

1     2     3     4     5     6     7     8     9     10   11   12   13   14   15

A     A     A     A     A     A     Y     Y     M    M    D     D     N    N    S

前六位AAAAAA是身份证编码对象的所在地(出生地)的编码,该号码可由国家统计局公布的相关标准中得到。YY表示出生年的后两位,MM和DD表示出生月和日,不足两位的高位补0,NNS为顺序号,无法确定。S为性别识别码,男性为奇数,女性为偶数。了解了这些,再来写代码就变得容易多了。

二、算法实现

了解了身份证号码的规则后,我们就可以推断出,身份证的15位转化位需要两步。首先把15位身份证号补全为17位,然后再补全最后一位。但是最后一位是数字还是字母X?这里又出现了问题。我们知道,身份证的最后一位为校验位,那么最后一位是怎么得到的呢?原来,最后一位是由数字1-9组成,超过9的比如11就用字母X表示,否则号码就变成了19位。了解了这些,经过整理得出身份证补全算法实现思想如下:

step1、将15位身份证号码加入出生年变为17位

  step2、将step1得到的身份证17位数分别乘以不同的系数。从第1位到第17位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2.

  step3、将这17位数字和系数相乘的结果相加

  step4、将step3的结果除以11,得出余数

由于数字的特殊性,这些余数只可能是0-10这11个数字,身份证最后一位的对应数字为1-0-X-9-8-7-6-5-4-3-2.。例上面的余数结果为3那么对应身份证号码的最后一位就是9,如果是10,身份证最后一位便是2。

代码如下:

public static void main(String[] args) {

  System.out.println(transIDCard15to18("370986890623212"));

  System.out.println(transIDCard15to18("370725881105149"));

 }

 /**

  * @param IdCardNO

  * @return 18位标准身份证号

  * 方法用途:15位身份证转化为18位标准证件号

  * @return String

  * @author 我心自在

  */

 public static String transIDCard15to18(String IdCardNO){

  String cardNo=null;

  if(null!=IdCardNO&&IdCardNO.trim().length()==15){

   IdCardNO=IdCardNO.trim();

   StringBuffer sb=new StringBuffer(IdCardNO);

   sb.insert(6, "19");

   sb.append(transCardLastNo(sb.toString()));

   cardNo=sb.toString();

  }

  return cardNo;

 }

 /**

  * 方法用途:15位补全‘19'位后的身份证号码

  * @param newCardId

  * @return

  * @return String

  * @author 我心自在

  */

 private static String transCardLastNo(String newCardId){

  char[] ch=newCardId.toCharArray();

  int m=0;

  int [] co={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

  char [] verCode=new char[]{'1','0','X','9','8','7','6','5','4','3','2'};

  for (int i = 0; i < newCardId.length(); i++) {

   m+=(ch[i]-'0')*co[i];

  }

  int residue=m%11;

  return String.valueOf(verCode[residue]);

 } 

测试结果如下:

三、总结

身份证号码补全虽然简单,但是前提需要了解我国公民的身份证构成原理才能正确验证,今天将这个学习过程分享给大家,希望对大家有所帮助,学习是个永无止境的过程,只有不断学习才能有进步!

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • javascript把15位身份证转成18的函数

    javascript把15位身份证转成18 var v = new Array(); var vs = "10X98765432"; var newCardID = ""; function onload() { document.getElementById("cardID").focus(); } function checkCardID(cardID15) { v.push(2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2,

  • 15/18位身份证号码验证的正则表达式总结(详细版)

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM dd 375 0     十八位 xxxxxx    yy MM dd   75 0     十五位 地区: [1-9]\d{5} 年的前两位: (18|19|([23]\d))            1800-2399 年的后两位: \d{2} 月份: ((0[1-9])|(10|11|12)) 天

  • javascript 身份证号码验证函数(可辨真伪,支持15或18位身份证号)测试误差为0

    //验证身份证号方法 var test=function(idcard){ var Errors=new Array("验证通过!","身份证号码位数不对!","身份证号码出生日期超出范围或含有非法字符!","身份证号码校验错误!","身份证地区非法!"); var area={11:"北京",12:"天津",13:"河北",14:"山西

  • 15位和18位身份证JS校验的简单实例

    一.身份证号码的结构和表示形式 1.号码的结构 根据[中华人民共和国国家标准GB11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 3.出生日期码 表示编码对象出生的年.月.日,按GB/T7408的规定执行,年.月.日代码之间不用分隔符. 4.顺序

  • js身份证判断方法支持15位和18位

    复制代码 代码如下: //HTML页面上要有一个id为identity_card的input输入框,一个id为ipmessage的身份证错误或正确时提示消息的地方 <script> //身份证验证 $(document).ready(function(){ $("#identity_card").change(function(){ var idcard =$(this).val(); checkDate(idcard ); }); }); //身份证 function c

  • C#小程序15位转18位身份证号代码

    现在我们使用的都是18位身份证号,而以前都是15位身份证号,而如何将15位身份证号转18位身份证号转换为18位身份证号呢? 1.首先,在15位身份证的第6位之后加上"19"变为17位,即出生年月的年加上19,比如原来的92年就变为1992 2.然后,就是最后一位的计算,方法如下: 1)将1得到的17位身份证号,每一位乘以相应的系数,17位系数为{ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 } 2)将(1)求得17个数相加求和

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

    前言 最近在参与一个银行项目-某银行安防系统-反洗钱需求的开发,银行项目的离不开身份证号码,身份证号码作为我国公民的唯一标识,有这非同寻常的意义,由于业务的要求15位的身份证号码无法命中,所以需要补全为18位,一开始自己想着加个年份的前两位,后面再加个X不就行了嘛,后来代码写不下去了,上网查了资料,才知道自己想的是多么天真,还是比较复杂的,折腾了一下午终于有了眉目. 一.15位身份证和18位身份证号码结构介绍 要进行身份证号码的验证,首先需要了解我国身份证号码的编码规则.我国身份证号码多由若干位

  • MySQL5.7.18下载和安装过程图文详解

    MySql下载 1.打开官网找到下载路口,这里直接给出下载的地址 https://dev.mysql.com/downloads/mysql/ 2.选择64位版本 3.直接下载  MySql5.7.18.1安装过程 1   .运行安装软件,接受协议 2.选择默认安装 3.下一步到检查环境界面,点击"Execute"执行检查 (可以后面单独下载插件安装),点击Next 4.点击"Execute"安装产品,安装成功后会打钩,然后Next 5.点击Next进入配置 6.默

  • Mysql5.7.18的安装与主从复制图文详解

    CentOS6.7安装mysql5.7.18 1.  解压到/usr/local目录 # tar -zxvf mysql-5.7.18-linux-glibc2.5-i686.tar.gz -C /usr/local 2.  mysql-5.7.18-linux-glibc2.5-i686文件夹重命名为mysql # cd /usr/local # mv mysql-5.7.18-linux-glibc2.5-i686/ mysql 3.  新建mysql用户组和mysql用户 # groupa

  • Go1.18新特性对泛型支持详解

    目录 1.泛型是什么 2.泛型类型的定义 2.1.声明一个自定义类型 2.2.内置的泛型类型any和comparable 2.3.泛型中的~符号是什么 1.泛型是什么 Go1.18增加了对泛型的支持,泛型是一种独立于使用的特定类型编写代码的方式.现在可以编写函数和类型适用于一组类型集合的任何一种.泛型生命周期只在编译期,旨在开发中减少重复代码的编写. 由于go属于静态强类型语言,例如在比较两个数的大小时,没有泛型的时候,仅仅只是传入类型不一样,我们就要再复制一份一样的函数,如果有了泛型就可以减少

  • MySQL六种约束的示例详解(全网最全)

    目录 一.概述 二.约束演示 三.外键约束 1. 什么是外键约束 2. 不使用外键有什么影响 3. 添加外键的语法 4. 删除/更新行为 5. 演示删除/更新行为 四.主键id到底用自增好还是uuid好 五.实际开发尽量少用外键 一.概述 概念: 约束是作用于表中字段上的规则,用于限制存储在表中的数据. 目的: 保证数据库中数据的正确.有效性和完整性. 分类: 注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束. 二.约束演示 上面我们介绍了数据库中常见的约束,以及约束涉及到的关

  • Linux(Ubuntu 18.04)上安装Anaconda步骤详解

    Anaconda是最受欢迎的python数据科学和机器学习平台,用于大规模数据处理,预测分析和科学计算.Anaconda发行版附带了1,000多个数据包,conda命令行工具和Anaconda Navigator的桌面图形用户界面. 本教程将指导您完成在Ubuntu 18.04上下载和安装Anaconda Python Distribution. 下载Anaconda 在撰写本文时,Anaconda的最新稳定版本是5.3版本. 请选择 64-Bit (x86) Installer 进行下载链接:

  • Redis全量复制与部分复制示例详解

    Redis 主从复制 Redis 实例划分为主节点(master)和从节点(slave) 默认情况下,Redis都是主节点 每个从节点只能有一个主节点,而主节点可以同时具有多个从节点 复制的数据流是单向的,只能由主节点复制到从节点 slaveof 命令在使用时,可以运行期动态配置,也可以提前写到配置文件中 主从复制 步骤 详细描述 保存主节点信息 执行slaveof后从节点只保存主节点的地址信息便直接返回 主从建立socket连接 从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,

  • js实现窗口全屏示例详解

    前言 该 demo 包含全屏事件.退出全屏事件以及屏幕状态改变的钩子函数的封装 以下是一个完整示例,只需整体拷贝下来运行即可(注意引入了 jquery) 请在这里查看示例☞ fullscreen示例 示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <script sr

  • ASP.NET全栈开发教程之前后台校验结合详解

    前言 在Web系统开发时,往往会有存在大量的交互操作,交互就必须校验数据的准确性啊,且不说一个字段可能存在多种校验,若一个表单提交有10个字段难道我们要对这10个字段分别写代码去校验吗?如果是这样,那每一个表单都要单独去写一份校验岂不是太痛苦了? 为了解决这个问题,聪明的程序员们开始了"偷懒"! 今天我们介绍一位在.NET平台下偷懒的--"FluentValidation",正如其名,流利的验证,他将我们的验证开发工作变得流利甚至优美了起来. 接下来我们就来看看如何

  • JavaScript 实现点击关闭全屏示例详解

    目录 引言 思路 具体实现 问题升级 引言 今天,我们来探讨的问题是: 当点击图片的时候,我们需要其全屏展示,当我们再次点击的时候,图片退出全屏播放. PS: 我们退出全屏播放的情况一般是按 esc 退出.图片可以延伸到任何的 DOM 节点 在文末,我会将问题升级,留一个题目给读者思考

随机推荐