您当前的位置: 首页 >  梁云亮

【精品】身份证操作工具类

梁云亮 发布时间:2021-04-29 13:08:52 ,浏览量:3

理论基础

410001910101123 410001 910101 123
41000119910101123X 410001 19910101 123X

15位:6位地址码+6位出生年月日(900101代表1990年1月1日出生)+3位顺序码
18位:6位地址码+8位出生年月日(年、月、日分别用4位、2位(不足两位加0)、2位(不足两位加0)数字表示,之间不用分隔符)+3位顺序码+1位校验码

  • 地区码:
    1、 第一、二位表示省(自治区、直辖市、特别行政区)。
    2、 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。
    3、 第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。
  • 顺序码:
    表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
  • 校验码
    是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,
    而19位的号码违反了国家标准,并且中国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
    具体校验的计算方式及步骤如下:
    1)对前17位数字本体码加权求和:
    S = Sum(Ai * Wi), i = 0, … , 16
      其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
    2)以11对S取模:
    Y = mod(S, 11)
    3)根据模Y 的值得到对应的校验码
    Y值 0 1 2 3 4 5 6 7 8 9 10
      校验码 1 0 X 9 8 7 6 5 4 3 2
    其中X来代替用来罗马数字中的10,即Ⅹ。

代码

public class IdCardUtil {

    /**
     * 将15位转换为18位
     *
     * @param idCard 15位身份证号
     * @return String 18位身份证号
     */
    private static String tran15to18(String idCard) {
        if (idCard == null || "".equals(idCard)) {
            throw new RuntimeException("身份证不能为空");
        }
        if (idCard.length() != 15) {
            throw new RuntimeException("身份证长度不正确");
        }
        idCard = idCard.substring(0, 6) + "19" + idCard.substring(6);//加入年份,变成17位

        //计算校验位   begin
        char[] Ai = idCard.toCharArray();
        int[] Wi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        char[] verifyCode = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
        int S = 0;
        int Y;
        for (int i = 0; i             
关注
打赏
查看更多评论