1 package com.jdk7.chapter5;
 2
 3 /**
 4  * 仅能校验15位或18位身份证号的校验码
 5  * @author Administrator
 6  *
 7  */
 8 public class IDCardTest {
 9     private static final int[] weigth = new int[] {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
10     private static final int[] checkCode = new int[] {1,0,'x',9,8,7,6,5,4,3,2};
11
12     /**
13      * 如果是15位身份证号则升级为18位身份证
14      * 然后统一对18为身份证号最后一位进行校验,取18位身份证号最后一位和前17位通过公式计算的结果比较
15      * @param str
16      * @return
17      */
18     public static  boolean isIDcard(String str){
19         if(str.length()==15){
20             str = IDCardTest.updateID(str);
21         }
22         if(str.length()!=18){
23             return false;
24         }
25         String code = str.substring(17, 18);
26         if(code.equals(getCheck(str))){
27             return true;
28         }
29         return false;
30     }
31
32     /**
33      * 1.15位的身份证号在出生年份前+19,组成17为数
34      * 2.再获取17位数的验证码
35      * 3.17位数+验证码组成18位的身份号
36      * @param fifteenstr
37      * @return
38      */
39     public static String updateID(String fifteenstr){
40         StringBuffer sb = new StringBuffer();
41         String eigthteen = fifteenstr.substring(0, 6);
42         eigthteen = (sb.append(eigthteen).append("19").append(fifteenstr.substring(6, 15))).toString();
43         eigthteen = eigthteen + getCheck(eigthteen);
44         return eigthteen;
45     }
46
47     /**
48      * 对参数前17位进行校验码计算:
49      * 18位身份证号由17位数字体+1位校验码组成,排列从左至右依次为:6位地区代码+8位出生日期+3位顺序码+1为校验码
50      * 3位顺序码为同一天出生序号,奇数为男性,偶数为女性
51      * 身份证校验码的关键技术为:
52      * 对前17数字本体码和加权求和,S=Sum(Ai*Wi),i=0...16,Ai表示第i个位置上身份证号码对应的数字,Wi表示第i个位置上加权因子对应值
53      * 加权因子从0到16的值分别为7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
54      * 对S取模,Y=mod(S,11)
55      * 通过Y获取校验码,Y对应的值即为校验码,对应关系为如下:
56      * <0,1>、<1,0>、<2,x>、<3,9>、<4,8>、<5,7>、<6,6>、<7,5>、<8,4>、<9,3>、<10,2>
57      * 对应关系中前者为Y,后者为校验码
58      * @param str
59      * @return
60      */
61     public static String getCheck(String str){
62
63         if(str.length()==18){
64             str = str.substring(0, 17);
65         }
66         int Y = 0;
67         if(str.length()==17){
68             int[] a = new int[str.length()];
69             int sum = 0;
70             for(int i=0;i<str.length();i++){
71                 a[i] = Integer.parseInt(str.substring(i, i+1));
72                 sum = sum + (a[i] * weigth[i]);
73             }
74             Y = sum % 11;
75         }
76         return (Y==2)?"x":String.valueOf(checkCode[Y]);
77     }
78
79     public static void main(String[] args) {
80         String id = "110105198709191369";
81 //        String id = "110105870919136";
82         System.out.println(id+"校验码是否通过?"+IDCardTest.isIDcard(id));
83     }
84 }
85
86 执行结果:
87 110105198709191369校验码是否通过?true

转载于:https://www.cnblogs.com/celine/p/8463409.html

18位身份证号码最后一位校验相关推荐

  1. 18位身份证号码最后一位校验码的计算方法

    介绍18位身份证号码最后一位校验码的计算方法 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. ...

  2. 关于18位身份证号码最后一位计算(Java实现)

    关于18位身份证号码最后一位计算(Java实现) 现代的身份证号码长度都是18位的,但是只要知道前17位便可推出第18位数字或者字母(第18位为0,1,...,9和X中的一个).也就是说,国内不存在前 ...

  3. 15位和18位身份证号码的结构介绍

    身份证号码编码方法 要进行身份证号码的验证,首先要了解身份证号码的编码规则.我国身份证号码多由若干位数字或者数字与字母混合组成.早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,后来考 ...

  4. 校验18位身份证号码(判断最后一位校验位和性别)

    身份证号码组成 公民身份号码是一系列组合码,由十七位数字本体码和一位校验码组成. 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码. 18位身份证最后一位校验码的 ...

  5. js中15位及18位身份证号码的校验

    15位身份证结构: 地区代码(6位),年(2位)月(2位)日(2位),顺序码(3位,最后1位偶数代表女,奇数代表男) 18位身份证结构: 地区代码(6位),年(4位)月(2位)日(2位),顺序码(3位 ...

  6. 15或18位身份证号码增强校验

    1. 背景简介 目前部分项目用到了增强的身份证号码验证,要验证15位.18位.行政区划.日期合法性.校验位(仅对18位)等特点. 当前i产品仅提供一个函数idcheck可以用来验证身份证合法性,用法为 ...

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

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  8. java代码实现15位身份证号码升级到18位

    转载网址   点击打开链接 转载一份作为记录,真心不错.受教! 18位身份证号码的组成: 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字 ...

  9. 自动转换15位身份证号码位18位

     功能:将15的身份证号升为18位(根据GB 11643-1999)  参数:原来的号码(15位)  返回:升位后的18位号码  用法:=IDCODE(a1)  (假设A1放的是原15位号码) 关于身 ...

最新文章

  1. php字符串转换表达式,php处理字符串格式的计算表达式
  2. 欢迎参加城市大脑与智慧城市前沿趋势 主题论坛 |未来科技大讲堂 第12期
  3. SpringCloud 分布式事务解决方案
  4. 怎么判断间隙过渡过盈配合_尺寸公差配合与装配方法
  5. 算法练习day17——190405
  6. mysql scrapy 重复数据_mysql数据库如何处理重复数据?
  7. 科普漫画 | 沙子如何变成芯片?
  8. spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题
  9. 全志A20单独烧录内核
  10. jenkins插件管理提示“update information obtained:不可用ago”
  11. mysql explain desc_MySQL中EXPLAIN结果的参数详解
  12. 【DL小结1】DL入门
  13. 什么是html文件?html格式如何打开?(图文讲解)
  14. 1-3(中文版)语法和词性总结
  15. Python:打印星号
  16. Uint8 Uint16等的区别
  17. 数据链路层协议 ——— 以太网协议
  18. Integer类型与int的==比较
  19. 删除 linux的ln文件夹,详解Linux ln 命令
  20. 针对C64x+的一些优化经验(转帖)

热门文章

  1. Linux Python离线下载模块
  2. HanLP --- 依存句法分析
  3. MATLAB在线工具,画图啥的都不用安装了,超级实用
  4. 关于单片机上的BOOT0和BOOT1
  5. 如何实现Word、PDF、TXT文件的全文内容检索?
  6. Cortex-M4架构
  7. JS中“创建对象”及“通过原型创建对象”浅析
  8. Direct3DCreate9与Direct3DCreate9Ex
  9. Scalar数据类型
  10. 26岁数学天才回国任教,刚以中科大教授之名攻破世界级难题