Java 实现15位身份证号码转18位身份证号码


在这里插入图片描述

一,思路分析

15位身份证号码转换为18位身份证号码的思路主要基于身份证号码的构成规则和校验码的计算方法。

(一)身份证号码构成规则

  1. 15位身份证号码

    • 前6位:地区码
    • 中间6位:出生年月日(格式为YYMMDD,即两位年份、两位月份、两位日期)
    • 后3位:顺序码(奇数代表男性,偶数代表女性)
  2. 18位身份证号码

    • 前6位:地区码(与15位身份证相同)
    • 中间8位:出生年月日(格式为YYYYMMDD,即四位年份、两位月份、两位日期)
    • 后3位:顺序码(与15位身份证相同,但放在新的格式中)
    • 最后1位:校验码(根据前17位数字计算得出)

(二)转换步骤

  1. 升级年份信息

    • 由于15位身份证号码中的年份是两位的,所以需要将其升级为四位。这通常是通过在年份前添加“19”或“20”来实现的,具体取决于该身份证的发放年份。例如,如果15位身份证的年份是“64”,那么在转换时可能需要将其升级为“1964”。
  2. 形成17位号码

    • 在15位身份证号码的基础上,通过升级年份信息,可以形成一个17位的号码。这个号码由前6位的地区码、升级后的8位出生年月日和后3位的顺序码组成。
  3. 计算校验码

    • 校验码是根据前17位号码计算得出的。计算方法是:将前17位号码的每一位数字分别乘以一个固定的系数(这些系数通常是7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2),然后将得到的乘积相加得到一个总和。接着,将这个总和除以11,得到一个余数。这个余数就是校验码在映射表中的索引,映射表通常是“1、0、X、9、8、7、6、5、4、3、2”。通过查找映射表,可以找到对应的校验码。
  4. 形成18位号码

    • 最后,将计算出的校验码添加到17位号码的末尾,就形成了一个完整的18位身份证号码。

二,15位身份证号码示例

110105491231001
320322480630452
510104470101003
652923460229124
440524450715678

三,源码

// 权重因子                                                                                                   
private static final int[] COEFFICIENT_ARRAY = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};     
// 校验码字符集                                                                                                 
private static final String[] IDENTITY_MANTISSA = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};

public static String convert15To18BitIdCard(String identity) {                                     
    if (!is15BitLegalIdCard(identity)) {                                                           
        throw new IllegalArgumentException("Invalid 15-bit ID card number");                       
    }                                                                                              
                                                                                                   
    // 提取各个部分                                                                                      
    String regionCode = identity.substring(0, 6);                                                  
    String year = identity.substring(6, 8);                                                        
    String month = identity.substring(8, 10);                                                      
    String day = identity.substring(10, 12);                                                       
    String orderCode = identity.substring(12);                                                     
                                                                                                   
    // 将年份扩展为四位                                                                                    
    int yearInt = Integer.parseInt(year);                                                          
    String extendedYear = (yearInt > 30 ? "19" : "20") + year;                                     
                                                                                                   
    // 组合成17位(不含校验码)                                                                               
    String idWithoutCheckCode = regionCode + extendedYear + month + day + orderCode;               
                                                                                                   
    // 计算校验码                                                                                       
    int checkSum = 0;                                                                              
    for (int i = 0; i < 17; i++) {                                                                 
        checkSum += Character.getNumericValue(idWithoutCheckCode.charAt(i)) * COEFFICIENT_ARRAY[i];
    }                                                                                              
    int mod = checkSum % 11;                                                                       
    String checkCode = IDENTITY_MANTISSA[mod];                                                     
                                                                                                   
    // 组合成18位                                                                                      
    return idWithoutCheckCode + checkCode;                                                         
}                       

四,运行示例

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值