java代码验证身份证号码

来源:互联网 发布:python lxml 编辑:程序博客网 时间:2024/04/28 17:19

import java.util.Scanner;

/**
 * 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7910584216379105842
 * 2.将这17位数字和系数相乘的结果相加。
 * 3.用加出来和除以11,看余数是多少?
 * 4余数只可能有012345678910这11个数字。其分别对应的最后一位身份证的号码为10X98765432。
 * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
 * @author hanson
 *
 */

/**
 * 身份证验证类
 *
 * @author hanson
 *
 */
public class IdCard {

    /**
     * 程序的主方法,入口。获取用户输入并输出验证结果
     *
     * @param args
     *            参数数组
     */
    public static void main(String[] args) {
        Scanner strReader = new Scanner(System.in);
        String idStr = strReader.nextLine();
        if (check(idStr)) {
            System.out.println("身份证验证正确");
        } else {
            System.err.println("对不起,这不是合法的身份证,请检查输入 !");
        }
    }

    /**
     * 求出身份证每一位加权乘积之和
     *
     * @param idStr
     *            身份证号码
     * @return 加权乘积之和
     */
    private static int product(String idStr) {
        int[] interest = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
                5, 8, 4, 2 };// 各位的权重
        char[] id = idStr.toCharArray();// 将身份证各位提取为字符数组
        int products = 0;
        for (int i = 0; i < 17; i++) {
            products = products + interest[i] * (id[i] - '0');
        }
        return products;
    }

    /**
     * 对乘积之和进行求余并匹配最后的一位数字
     *
     * @param product
     *            各位加权乘积之和
     * @return 返回最后一个数字
     */
    private static char match(int product) {
        char[] last = new char[] { '1', '0', 'x', '9', '8', '7', '6', '5', '4',
                '3', '2' };// 末尾匹配
        return last[product % 11];
    }

    /**
     * 将通过计算得到的最后一位数字和身份证号码的最后一位进行对比
     *
     * @param idStr
     *            身份证号码
     * @return 如果是相同的,则表示是正确的,返回true,如果两个数字不一样就返回false
     */
    private static boolean check(String idStr) {
        if (idStr.charAt(17) == match(product(idStr))) {
            return true;
        } else {
            return false;
        }
    }
}