保存一个Andorid用身份证号码校验工具类

身份证最后一位校验码计算规则:

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 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;
        }
    }
}

你可能感兴趣的:(保存一个Andorid用身份证号码校验工具类)