公民身份号码是特征组合码,由17位数字本体码和1位数字校验码组成。排列顺序从左至右依次为:6位数字地址码、8位数字出生日期码,3位数字顺序码和1位数字校验码。
    地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按 GB/T 2260的规定执行。
    出生日期码:表示编码对象的出生年、月、日,按GB/T 7408的规定执行。
    顺序码:表示在同一地址码所标识的区域范围内,对同年,同月,同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
    校验码:校验码采用ISO 7064: 1983, MOD 11-2校验码系统。

一、关键技术点
    1、求验证码的方法是:
        对前17位数字本体码加权求和,公式为:S = Sum(Ai * Wi),i = 0,......,16,其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,加权因子的值从0到16位分别为7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
        然后对S取模,公式为:Y = mod(S,11)。
        然后通过模Y得到对应的校验码。对应关系为<0,1>,<1,0>,<2,X>,<3,9>,<4,8>,<5,7>,<6,6>,<7,5>,<8,4>,<9,3>,<10,2>。关系中前者为Y值,后者为对应的校验码。
       
二、演示实例

/** */ /**
 * 文件名IDCard.java
 */
package  book.oo.String;

public   class  IDCard  ... {
    private static final int[] weight = new int[] ...{ 7, 9, 10, 5, 8, 4, 2, 1, 6,
            3, 7, 9, 10, 5, 8, 4, 2, 1 }; // 加权因子
    private static final int[] checkDigit = new int[] ...{ 1, 0, 'X', 9, 8, 7, 6,
            5, 4, 3, 2, };
    
    public IDCard() ...{
    }
    
    /** *//**
     * 计算18位身份证的校验码
     */
    private String getCheckDigit(String eighteenCardId) ...{
        int remaining = 0;
        //先取得18位身份证的17位本体码
        if(eighteenCardId.length() == 18) ...{
            eighteenCardId = eighteenCardId.substring(0, 17);
        }
        //根据公式对本体码进行加权求和
        if(eighteenCardId.length() == 17) ...{
            int sum = 0;
            int[] a = new int[17];
            //先对前17位数字的权求和
            for(int i = 0; i < 17; i++) ...{
                String k = eighteenCardId.substring(i, i+1);
                a[i] = Integer.parseInt(k);
            }
            for(int i = 0; i < 17; i++) ...{
                sum = sum + weight[i] * a[i];
            }
            //再与11取模
            remaining = sum % 11;
        }
        //返回校验码
        return remaining == 2 ? "X" : String.valueOf(checkDigit[remaining]);
    }
    
    /** *//**
     * 将15位身份证号码升级为18位身份证号码
     */
    private String update2eighteen(String fifteenCardID) ...{
        //15位身份证上的生日的年份没有加19,要加上
        String eighteenCardID = fifteenCardID.substring(0,6);
        eighteenCardID = eighteenCardID + "19";
        eighteenCardID = eighteenCardID + fifteenCardID.substring(6,15);
        eighteenCardID = eighteenCardID + this.getCheckDigit(eighteenCardID);
        return eighteenCardID;
    }
    
    /** *//**
     * 验证身份证是否符合格式
     */
    public boolean verify(String idcard) ...{
        if(idcard.length() == 15) ...{
            idcard = this.update2eighteen(idcard);
        }
        if(idcard.length() != 18) ...{
            return false;
        }
        //获取身份证上的最后一位,它是校验码
        String checkDigit = idcard.substring(17,18);
        //比较获取的校验码与生成的校验码是否相等
        if (checkDigit.equals(this.getCheckDigit(idcard))) ...{
            return true;
        }
        return false;
    }
    
    public static void main(String[] args) ...{
        IDCard test = new IDCard();
        String idCardStr = "110105194912310025";
        System.out.println("身份证:" + idCardStr + "验证合格?" + test.verify(idCardStr));
        idCardStr = "632826198011290019";
        System.out.println("身份证:" + idCardStr + "验证合格?" + test.verify(idCardStr));
    }

}

输出结果:

身份证:110105194912310025验证合格?false
身份证:632826198011290019验证合格?true

java字符串应用之18位身份证格式验证相关推荐

  1. java,javascript对18位身份证格式的验证算法

    参考资料  1 java实现的18位身份证格式验证算法  http://fanqiang.chinaunix.net/program/java/2006-06-22/4639.shtml   原码中有 ...

  2. 15/18位身份证号码验证

    15/18位身份证号码验证 在做身份证验证之前你得明确身份证号的组成. 首先我告诉你,18位身份证号码后面的字母只有"X"这一个.(X是罗马数字的10,用X来代替10,可以保证您的 ...

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

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

  4. MySQL正则表达式判断身份证_15/18位身份证号码验证的正则表达式总结(详细版)...

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

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

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

  6. .Net验证18位身份证格式

    /// <summary>/// 验证18位号码/// </summary>/// <param name="Id"></param> ...

  7. 学习正则表达式 - 18位身份证号

    一.身份证号规则 18位身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码.其含义如下: 地址码:表示编码 ...

  8. 15位或18位身份证验证

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

  9. js 身份证精确校验(支持15位和18位身份证号 )

    js 校验方法 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCode(code){var city={11:&qu ...

最新文章

  1. IDEA配置NodeJS项目遇到问题及解决
  2. 7 开机启动文件路径_为什么当我登录的时候,总有一些文件会被打开
  3. Netty初步之hello world
  4. 打开excel文件并写入_双击Excel表格文件时只打开程序不能直接打开文件
  5. 【转】LAMP网站架构方案分析【精辟】
  6. 【CodeForces - 1020B】Badge(模拟,图,环)
  7. Spring boot restful api 方法参数 BindException 异常处理
  8. linux命令--ldconfig和ldd用法
  9. 黑石集团(Black Stone)黑岩公司(Black Rock)
  10. Gradle下载失败的解决办法
  11. 无线打印服务器三星3200,求助三星3200打印机“USB打印机不可用”
  12. android ios mp4格式转换,ios 开发 视频格式转换、mov转MP4
  13. ddos源码 ntp_了解NTP DDOS攻击原理
  14. html中伪类选择符,【CSS选择符】伪类和伪元素
  15. iPhone X 为啥弃 TouchID?
  16. POJ 1625 Censored!
  17. 射频识别技术:RFID 您了解不?
  18. matlab偏差补偿最小二乘,基于偏差补偿递推最小二乘的Hammerstein-Wiener模型辨识
  19. 奇偶数排序--整数数组的奇偶数分开(小米公司笔试题)
  20. 贝壳找房户外拓展(中等) 扫描线

热门文章

  1. 【一起入门MachineLearning】中科院机器学习第3课-朴素贝叶斯分类器
  2. python中如何比较日期大小_python 日期大小比较
  3. position为absolute与fixed区别
  4. Type-C、USB-C、USB3.1 三者关系
  5. fan4801开关电源原理图_FAN41501
  6. 5000字深度丨阿里巴巴用AI破局孕妇糖尿病
  7. 坐标系统投影变换分带方法
  8. Pycharm中无法通过点击查看csv文件解决方法
  9. java环境JDK的安装及判断是否安装成功
  10. STC12CA560S2 ADC/PWM相关例程