最近在参与一个项目需求的开发,其中涉及到了身份证号码,身份证号码作为我国公民的唯一标识,有着非同寻常的意义,由于业务的要求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]);

}

测试结果如下:

三、总结

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

mysql 计算15位身份证_15位身份证补全为18位身份证算法相关推荐

  1. Android使用EditView输入框输入身份证时,自动补全身份证最后一位验证位

    Android使用EditView输入框输入身份证时,自动补全身份证最后一位验证位 下面直接贴出代码 //监听输入框文本长度,并自动补全身份证最后一位验证位 mEdit.addTextChangedL ...

  2. 请写代码校验第二代身份证号码有效性。程序接收一个18位的身份证号码和性别,根据以下规则输出号码是有效还是无效。

    请写代码校验第二代身份证号码有效性.程序接收一个18位的身份证号码和性别,根据以下规则输出号码是有效还是无效. 第二代身份证号组成规则: a) 身份证号码(18位)= 地址码(6)+ 出生日期码(8) ...

  3. mysql 计算15位身份证_15位到18位身份证的升级计算

    18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999<公民身份号码>中做了明确的规定. GB11643-1999<公民身份号码>为GB1164 ...

  4. mysql身份证校验码_用sql实现18位身份证校验代码分享 身份证校验位计算

    身份证校验码的计算方法 1.将前面的身份证号码17位数分别乘以不同的系数.第i位对应的数为[2^(18-i)]mod11.从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 ...

  5. 以为微信里3008位好友就是人脉,殊不知有18位已经把我删除了

    我在平台发表文章时,在平台上时常收到有些读者的私信,说看了我的文章后,很有感慨,又加了微信后说以后多交流交流. 当时可把我乐坏了,没想到我的文章也能引起读者的共鸣,这是对我的支持和鼓励了. 然而,半年 ...

  6. java身份证工具类(校验身份证是否合法、通过身份证获取年龄、性别、生日,将15位身份证转为18位等)

    一.简介 因为工作需要经常用到身份证做一些相关操作,于是通过查阅资料总结出一些常用的工具方法,包括校验身份证是否合法.通过身份证获取年龄.通过身份证获取性别.通过身份证获取户籍地址.通过身份证获取生日 ...

  7. Java:15位或18位居民身份证号码通用校验(正则表达式、日期格式、末尾校验码)

    身份证号码校验,正则表达式校验.日期格式校验.18位身份证末尾校验码校验 前六位省市县号码变更频繁,这里就不做校验 import java.text.ParseException; import ja ...

  8. js 身份证校验 15位和18位

    /校验身份证号码 function checkIdCardNo(checkObj) {     var idCardNo = checkObj.value;     return verifyIdCa ...

  9. 15位、18位身份证号码正则表达式

    身份证正则表达式 在项目中遇到身份证号码验证,百度了一些资料,太简单的和太复杂的pass,综合了一些案例,取长补短,形成了个折中版本的,正则表达式如下: var reg =/(^[1-9]\d{5}( ...

  10. 身份证15位转18位(直接调用方法即可,简单方便!!!)

    背景: 将15位身份证号码转换为18位身份证号码的方法是: 在15位身份证号码前加上6位数字,即出生年份的前两位,地区编码的后两位,以及补全的两位数字,例如:19或20(以出生年份为准)+地区编码+补 ...

最新文章

  1. 编译内核出现make CONFIG_DEBUG_SECTION_MISMATCH=y错误
  2. python3菜鸟教程-Python3 元组
  3. c语言中赋值表达示与复制语句的区别
  4. 读书笔记_unity4.x第十二章_渲染管线
  5. TensorFlow(二)
  6. Linux 下shell中exec解析
  7. react学习(58)--this.props进行父子传值
  8. mysql连网安装和断网安装的区别_linux连网和jdk环境配置以及mysql安装
  9. 玩转springboot2.x之搭建Thymeleaf官方示例程序
  10. 【王道考研操作系统】—文件的基本操作
  11. C++模板中关键字typename与class的区别
  12. ssis 包_SSIS包中的错误处理概述
  13. C语言相反次序重新排序
  14. 用windows通过xrdp远程连接到ubuntu16后 Tab键无法使用
  15. Excel——字符串操作函数
  16. [转载]for循环的执行顺序
  17. 10款Mac上程序员装机必备的开发工具推荐和下载
  18. 一网打尽位图与矢量图
  19. BUUCTF-pwn(11)
  20. 使 div 水平 垂直 居中

热门文章

  1. Java常用软件官网下载地址【汇总】
  2. 中国地图json 文件下载
  3. 《Vue的基本语法》
  4. 配置各个连接oracle客户端
  5. 自由软件的开源许可介绍(GPL、BSD、LGPL、Apache License 2.0)
  6. 安装配置fcitx输入法
  7. matlab实现图像的拼接,MATLAB实现图像拼接算法(求助)
  8. 使用 Visual Studio 创建 .NET 控制台应用程序
  9. Win8快捷键的使用
  10. 计算机毕业论文任务书模板,计算机毕业论文设计任务书范文计算机系毕业论文任务书上的方法写.doc...