package com.comingnet.system;
public class F15ToE18 {
public static final String getNewId(String id)
{
/*
* 第十八位数字(校验码)的计算方法为:
1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.将这17位数字和系数相乘的结果相加。
3.用加出来和除以11,看余数是多少?
4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
*
*/
String new17id=id.subSequence(0, 6)+"19"+id.subSequence(6, id.length());
String[] w={"1","0","X","9","8","7","6","5","4","3","2"}; //尾数
int[] xs={7,9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5 ,8, 4, 2}; //要乘的系数
int num=0;
for(int i=0;i<new17id.length();i++)
{
num=num+Integer.parseInt(""+new17id.charAt(i))*xs[i];
}
int ys=num%11; //17位号码依次乘以相关的系数之和再除以11后的余数
String newid=new17id+w[ys]; //新生成的身份证号码
return newid;
}
public static void main(String args[])
{
System.out.println(getNewId("330102820612001"));
System.out.println(getNewId("330206821022307"));
System.out.println(getNewId("330283830119003"));
/* 测试号码
* 33028319830119003 4
* 33010219820612001 8
* 33028219820807001 5
* 33020619821022307 x
* 34052419800101001 x
*/
}
}
参考网上的资料,重新写了一下,很简单位。可能有些地方没有考虑到,直接在第6位之后加上19,我想原因可能是只考虑老的身份证转换的问题,如果是本世纪出生的人,身份证号码不会再出现15位了吧。