JAVA 身份证号和手机号、数字、区间范围相关工具

发布时间:2024年01月08日

身份证号和手机号、数字相关工具

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Validation {

    //数字表达式
    private final static Pattern number_pattern = Pattern.compile("^[0-9]*$");

    /**
     * 验证是数字
     * @param str 验证字符
     * @return boolean
     */
    public static boolean isNumber(String str) {
        return number_pattern.matcher(str).matches();
    }

    /**
     * 验证身份证号码是否正确
     * @param IDCardNo 身份证号码
     * @return boolean
     */
    public static String isIDCard(String IDCardNo) {
        if(IDCardNo.indexOf("X") != -1){
            IDCardNo = IDCardNo.replace("X", "x");
        }
        //记录错误信息
        String errmsg = "";
        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" };
        String Ai = "";

        //================ 身份证号码的长度 15位或18位 ================
        if (IDCardNo.length() != 15 && IDCardNo.length() != 18) {
            errmsg = "身份证号码长度应该为15位或18位!";
            return errmsg;
        }

        //================ 数字 除最后以为都为数字 ================
        if (IDCardNo.length() == 18) {
            Ai = IDCardNo.substring(0, 17);
        } else if (IDCardNo.length() == 15) {
            Ai = IDCardNo.substring(0, 6) + "19" + IDCardNo.substring(6, 15);
        }
        if (isNumber(Ai) == false) {
            errmsg = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字";
            return errmsg;
        }

        //================ 出生年月是否有效 ================
        //年份
        String strYear = Ai.substring(6, 10);
        //月份
        String strMonth = Ai.substring(10, 12);
        //日
        String strDay = Ai.substring(12, 14);
        if (DateUtils.getDateIsTrue(strYear, strMonth, strDay) == false) {
            errmsg = "身份证生日无效";
            return errmsg;
        }
        GregorianCalendar gc = new GregorianCalendar();
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
        try {
            if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150 || (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
                errmsg = "身份证生日不在有效范围";
                return errmsg;
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
            errmsg = "身份证生日不在有效范围";
            return errmsg;
        } catch (java.text.ParseException e1) {
            e1.printStackTrace();
            errmsg = "身份证生日不在有效范围";
            return errmsg;
        }
        if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
            errmsg = "身份证月份无效";
            return errmsg;
        }
        if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
            errmsg = "身份证日期无效";
            return errmsg;
        }

        //================ 地区码时候有效 ================
        if (getAreaCodeAll().get(Ai.substring(0, 2)) == null) {
            errmsg = "身份证地区编码错误";
            return errmsg;
        }

        //================ 判断最后一位的值 ================
        int TotalmulAiWi = 0;
        for (int i = 0; i < 17; i++) {
            TotalmulAiWi = TotalmulAiWi+ Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]);
        }
        int modValue = TotalmulAiWi % 11;
        String strVerifyCode = ValCodeArr[modValue];
        Ai = Ai + strVerifyCode;
        if (IDCardNo.length() == 18) {
            if (Ai.equals(IDCardNo) == false) {
                errmsg = "身份证无效,不是合法的身份证号码";
                return errmsg;
            }
        } else {
            return errmsg;
        }
        return errmsg;
    }

    /**
     * 获取身份证号所有区域编码设置
     * @return Hashtable
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static Hashtable getAreaCodeAll() {
        Hashtable hashtable = new Hashtable();
        hashtable.put("11", "北京");
        hashtable.put("12", "天津");
        hashtable.put("13", "河北");
        hashtable.put("14", "山西");
        hashtable.put("15", "内蒙古");
        hashtable.put("21", "辽宁");
        hashtable.put("22", "吉林");
        hashtable.put("23", "黑龙江");
        hashtable.put("31", "上海");
        hashtable.put("32", "江苏");
        hashtable.put("33", "浙江");
        hashtable.put("34", "安徽");
        hashtable.put("35", "福建");
        hashtable.put("36", "江西");
        hashtable.put("37", "山东");
        hashtable.put("41", "河南");
        hashtable.put("42", "湖北");
        hashtable.put("43", "湖南");
        hashtable.put("44", "广东");
        hashtable.put("45", "广西");
        hashtable.put("46", "海南");
        hashtable.put("50", "重庆");
        hashtable.put("51", "四川");
        hashtable.put("52", "贵州");
        hashtable.put("53", "云南");
        hashtable.put("54", "西藏");
        hashtable.put("61", "陕西");
        hashtable.put("62", "甘肃");
        hashtable.put("63", "青海");
        hashtable.put("64", "宁夏");
        hashtable.put("65", "新疆");
        hashtable.put("71", "台湾");
        hashtable.put("81", "香港");
        hashtable.put("82", "澳门");
        hashtable.put("91", "国外");
        return hashtable;
    }

    /**
     * 验证手机号码是否正确
     * @param phone
     * @return
     */
    public static  boolean isPhone(String phone){
        //正则表达式
        String phoneRegEx = "^1(3|4|5|6|7|8|9)\\d{9}$";
        //函数语法 匹配的正则表达式
        Pattern pattern = Pattern.compile(phoneRegEx);
        //进行匹配
        Matcher matcher = pattern.matcher(phone);

        if (!matcher.matches()) {//校验手机号格式是否正确,若是匹配成功则返回true
            System.out.println("手机号格式错误");
        }
        return matcher.matches();
    }

    /**
     * 根据身份证号获取年龄
     * @param sfzh
     * @return
     */
    public static String evaluate(String sfzh){
        if(sfzh== null || "".equals(sfzh) ){
            return "身份证件号有误,无法计算年龄";
        }

        if (sfzh.length() != 15 && sfzh.length() != 18){
            return "身份证件号有误,无法计算年龄";
        }

        String age="身份证件号有误,无法计算年龄";

        if(sfzh!= "身份证件号有误"){

            Calendar cal = Calendar.getInstance();
            int yearNow = cal.get(Calendar.YEAR);
            int monthNow = cal.get(Calendar.MONTH)+1;
            int dayNow = cal.get(Calendar.DATE);

            int year = Integer.valueOf(sfzh.substring(6, 10));
            int month = Integer.valueOf(sfzh.substring(10,12));
            int day = Integer.valueOf(sfzh.substring(12,14));

            if ((month < monthNow) || (month == monthNow && day<= dayNow) ){
                age = String.valueOf(yearNow - year);
            }else {
                age = String.valueOf(yearNow - year-1);
            }
        }
        return age;
    }
/**
     * 判断某个数值是否在某个区间
     * @param number 需判断的数值
     * @param minValue 最小值
     * @param maxValue 最大值
     * @return 结果
     */
    public static boolean isInRange(int number, int minValue, int maxValue) {
        return (number >= minValue && number <= maxValue);
    }
}
文章来源:https://blog.csdn.net/weixin_40750633/article/details/135456528
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。