通過身份證校驗位檢驗身份證正確性

算法:

W[] = 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
∑(a[i]×W[i])(mod 11)
校驗位:1 0 X 9 8 7 6 5 4 3 2
舉個栗子:
身份證號:102154198801238569
a[] = 10215419880123856
身份證每一位和W[]每一位相乘後求和,模除以11,取校驗位相應的位數即可

代碼

package utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * Created by lwg
 */
public class BankUtils {
    /**
     * 校驗身份證號
     *
     * @param idCardNo 身份證號
     * @return true通過,false未通過
     */
    public static boolean checkIdCardNo(String idCardNo) {
        if (null == idCardNo) {
            return false;
        }
        idCardNo = idCardNo.toLowerCase();
        if (null == idCardNo || (idCardNo.length() != 18 && idCardNo.length() != 15)) {
            return false;
        }
        String[] RC = {"1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2"};
        boolean checkBirthday;
        String birthday;

        try {
            if (idCardNo.length() == 18) {// 18位
                birthday = idCardNo.substring(6, 14);
                checkBirthday = isDate(birthday, "yyyyMMdd");

                int[] W = {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 < idCardNo.length() - 1; i++) {
                    int c = Integer.parseInt(idCardNo.substring(i, i + 1));
                    sum += W[i] * c;
                }
                int r = sum % 11;
                if (RC[r].equals(idCardNo.substring(17)) && checkBirthday) {
                    return true;
                } else {
                    return false;
                }
            } else {//15位
                birthday = "19" + idCardNo.substring(6, 12);
                checkBirthday = isDate(birthday, "yyyyMMdd");
                if (checkBirthday) {
                    return true;
                } else {
                    return false;
                }
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 是否爲合法日期
     *
     * @param dateString 日期
     * @param format 指定日期格式爲四位年/兩位月份/兩位日期,注意yyyy/MM/dd區分大小寫;
     * @return
     */
    public static boolean isDate(String dateString, String format) {
        boolean convertSuccess = true;
// 指定日期格式爲四位年/兩位月份/兩位日期,注意yyyy/MM/dd區分大小寫;
        SimpleDateFormat smf = new SimpleDateFormat(format);
        try {
// 設置lenient爲false. 否則SimpleDateFormat會比較寬鬆地驗證日期,比如2007/02/29會被接受,並轉換成2007/03/01
            smf.setLenient(false);
            smf.parse(dateString);
        } catch (ParseException e) {
//e.printStackTrace();
//如果throw java.text.ParseException或者NullPointerException,就說明格式不對
            convertSuccess = false;
        }
        return convertSuccess;
    }
}

原文鏈接:通過身份證校驗位檢驗身份證正確性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章