📄 calculateid.java
字号:
package com.sinosoft.common;
/*
* 创建日期 2006-11-09
*
* TODO 要更改此生成的文件的模板,请转至
* 鉴于老身份证只的15位,即可以在相应的位置加19,变成19位;然后根据17位数据生最后一位,使之成为18位
* @author leilufeng
*/
public class CalculateID {
/**
* 根据身份证号码的前17位数字生成最后一位的校验码
* @param IDCard17 身份证号码的前17位数字
* @return 校验码(身份证号码的第18位)
*/
public String GetCheckCode(String IDCard17){
/*
'按照ISO 7064:1983.11-2校验码计算出来的检验码
'公式如下:
'∑(ai×Wi)(mod 11)
'i----表示号码字符从右至左包括校验码在内的位置序号;
'ai----表示第i位置上的号码字符值;
'Wi----示第i位置上的加权因子,其数值依据公式Wi=2^(n-1)(mod 11)计算得出。
**/
int num = 0;
int[] weight = new int[] {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};
for(int i=17;i>=1;i--){
num+=Integer.parseInt(IDCard17.substring(17 - i, 17 - i+1)) * weight[17-i];
}
num = num % 11;
/*
'然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
'∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
'校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
*/
String checkcode ;
switch ( num){
case 0:
checkcode = "1" ;
break;
case 1 :
checkcode = "0";
break;
case 2 :
//TODO: 我的身份证是大的写的,所以就写成大写的X
checkcode = "X";
break;
default:
checkcode = String.valueOf (12 - num);
}
return checkcode;
}
/**
* 从17位转换位18位
* @param IDCard17
* @return
*/
public String getIDCard18(String IDCard17){
StringBuffer sb=new StringBuffer(IDCard17);
sb.append(GetCheckCode(sb.toString()));
return sb.toString();
}
public static void main(String[] args) {
CalculateID cid= new CalculateID();
System.out.println(cid.getIDCard18("370206711202001"));
System.out.println("431023198210235417x".replace('X', 'x'));//dujh修改 2008年7月15
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -