package com.huimv.receive.common.utils;

import java.util.regex.Pattern;

public class IDCardValidator {

    public static boolean isValidIDCard(String idCardNumber) {
        // 正则表达式用于验证身份证号
        String pattern = "\\d{17}[0-9Xx]";

        // 判断输入的身份证号是否符合规则
        if (!Pattern.matches(pattern, idCardNumber)) {
            return false;
        }

        // 获取身份证号的前17位
        String idCardDigits = idCardNumber.substring(0, 17);

        // 验证身份证号的前17位是否为数字
        if (!isNumeric(idCardDigits)) {
            return false;
        }

        // 验证身份证号的最后一位是否为合法校验位
        return isValidCheckDigit(idCardNumber);
    }

    // 判断字符串是否为纯数字
    private static boolean isNumeric(String str) {
        return str.matches("\\d+");
    }

    // 验证身份证号的校验位是否合法
    private static boolean isValidCheckDigit(String idCardNumber) {
        String checkDigit = idCardNumber.substring(17);
        String[] checkCodes = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            int coefficient = Integer.parseInt(idCardNumber.substring(i, i + 1));
            int weight = (int) Math.pow(2, 17 - i) % 11;
            sum += coefficient * weight;
        }
        return checkDigit.equalsIgnoreCase(checkCodes[sum % 11]);
    }

    public static void main(String[] args) {
        String idCardNumber = "身份证号"; // 替换为要验证的身份证号
        boolean isValid = isValidIDCard(idCardNumber);
        if (isValid) {
            System.out.println("身份证号正确！");
        } else {
            System.out.println("身份证号错误！");
        }
    }
}

