美文网首页Android-2Utils
保存一个Andorid用身份证号码校验工具类

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

作者: JarryLeo | 来源:发表于2018-08-15 18:04 被阅读142次

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

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

    相关文章

      网友评论

      本文标题:保存一个Andorid用身份证号码校验工具类

      本文链接:https://www.haomeiwen.com/subject/myowbftx.html