身份证最后一位校验码计算规则:
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。
身份证号码倒数第二位是用来表示性别的(奇数为男性,偶数为女性)
例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
首先:我们得出,前17位的乘积和是189
然后:用189除以11得出的结果是17 + 2/11,也就是说余数是2。
最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码
工具类代码:
import android.support.v4.util.SimpleArrayMap;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* create by : Jarry Leo
* date : 2018/8/15 16:47
*/
public class IdCardValidate {
/**
* 检查身份证号码是否合法
*
* @param id 身份证号码
* @return 检查结果
*/
public static boolean check(String id) {
return checkLength(id) &&
checkNumber(id) &&
checkLastCode(id) &&
checkDate(id) &&
checkAreaCode(id);
}
//检查长度
private static boolean checkLength(String id) {
return id.length() == 18;
}
//检查数字
private static boolean checkNumber(String id) {
String reg = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$";
return id.matches(reg);
}
//检查校验码
private static boolean checkLastCode(String id) {
String[] valCodeArr = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
String[] wi = {"7", "9", "10", "5", "8", "4", "2", "1",
"6", "3", "7", "9", "10", "5", "8", "4", "2"};
int sum = 0;
for (int i = 0; i < wi.length; i++) {
sum = sum + Integer.parseInt(String.valueOf(id.charAt(i)))
* Integer.parseInt(wi[i]);
}
int modValue = sum % 11;
return valCodeArr[modValue].equals(id.substring(17));
}
//检查地区码
private static boolean checkAreaCode(String id) {
SimpleArrayMap<String, String> map = new SimpleArrayMap<>();
map.put("11", "北京");
map.put("12", "天津");
map.put("13", "河北");
map.put("14", "山西");
map.put("15", "内蒙古");
map.put("21", "辽宁");
map.put("22", "吉林");
map.put("23", "黑龙江");
map.put("31", "上海");
map.put("32", "江苏");
map.put("33", "浙江");
map.put("34", "安徽");
map.put("35", "福建");
map.put("36", "江西");
map.put("37", "山东");
map.put("41", "河南");
map.put("42", "湖北");
map.put("43", "湖南");
map.put("44", "广东");
map.put("45", "广西");
map.put("46", "海南");
map.put("50", "重庆");
map.put("51", "四川");
map.put("52", "贵州");
map.put("53", "云南");
map.put("54", "西藏");
map.put("61", "陕西");
map.put("62", "甘肃");
map.put("63", "青海");
map.put("64", "宁夏");
map.put("65", "新疆");
map.put("71", "台湾");
map.put("81", "香港");
map.put("82", "澳门");
map.put("91", "国外");
return map.containsKey(id.substring(0, 2));
}
//检查日期
private static boolean checkDate(String id) {
String strYear = id.substring(6, 10);// 年份
String strMonth = id.substring(10, 12);// 月份
String strDay = id.substring(12, 14);// 日期
String date = strYear + "-" + strMonth + "-" + strDay;
SimpleDateFormat simpleDateFormat =
new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
try {
Calendar calendar = Calendar.getInstance();
Date parse = simpleDateFormat.parse(date);
boolean after = calendar.getTime().after(parse);
calendar.add(Calendar.YEAR, -150);
boolean before = calendar.getTime().before(parse);
return after && before;
} catch (ParseException e) {
return false;
}
}
}