-
18位身份证号码各位的含义:
1-2位省、自治区、直辖市代码;
3-4位地级市、盟、自治州代码;
5-6位县、县级市、区代码;
7-14位出生年月日,比如19670401代表1967年4月1日;
15-17位为顺序号,其中17位(倒数第二位)男为单数,女为双数;(如果是实名认证需要填入性别,可以使用填入的身份证号码校验填入的信息是否正确)
18位为校验码,0-9和X。作为尾号的校验码,是由把前十七位数字带入统一的公式计算出来的,计算的结果是0-10,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位。X是罗马数字的10,用X来代替10。
// 计算最后一位校验码 本体码各位数字乘以对应加权因子并求和 除以11得到余数是校验码 idcard是身份证
// 本体码
String code = idcard.substring(0, 17);
// 转换成数组
int[] IDnums = new int[code.length()];
for (int i = 0; i < code.length(); i++) {
IDnums[i] = Integer.parseInt(String.valueOf(code.charAt(i)));
}
// 加权因子
int[] x = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
// 对应字符
char[] checkCode = { '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2' };
int sum = 0;
for (int i = 0; i < code.length(); i++) {
int n = code.charAt(i) - 48;
sum = sum + n * x[i];
}
sum = sum % 11;
// 验证最后一位校验码和计算出来的不匹配则不同过验证
if (!idcard.substring(17, 18).equals(String.valueOf(checkCode[sum]))) {
return "该用户身份证号码不正确";
}