15位身份证补全为18位身份证算法

1、15位身份证和18位身份证号码结构介绍

我国早期的身份证号码是15位数,这是在1980前发放的身份证,但是后来考虑到千年虫的问题,有添加了18位身份证的号码编制规则。
15位身份证号只能为1900年1月1日到1999年12月31号出生的人编号,18位身份证号是将年的编码,由2位变为4位,顺序号增加一位。

2、算法实现

将15位身份证转化为18位身份证可以分为两步
1、将15位变为17位,既先将出生年月变过来。
2、补全最后一位,但是最后一位究竟补什么,是数字还是字母X?最后一位事是校验位,他也是一个数字,这里有一条规则,最后一位是由数字1-9组成,如果超过9就表示用X表示。

那么我们的思想就如下所示:
1、将15位身份证号变为17位
2、将第一步得到的身份证号分别乘以不同的系数。从第一位到第十七位的系数为7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
3、将所得系数相乘的结果相加
4、将第三步得到的结果除以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
        */
       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
        */
       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]);

       }

注:转自微信公众号:算法文摘。

你可能感兴趣的:(算法,文摘)