日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Android、Java超详细的身份证验证工具

發(fā)布時(shí)間:2023/12/20 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android、Java超详细的身份证验证工具 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先科普一下身份證的一些知識(shí)(知道的勿噴)

1-2 位:代表升級(jí)行政區(qū)代碼
3-4 位:代表地級(jí)行政區(qū)劃分代碼
5-6 位:代表縣區(qū)行政區(qū)分代碼
7-14 位:代表出生年、月、日,例如:19900101
15-17 位:代表 順序碼,同一地區(qū)同年、同月、同日出生人的編號(hào),奇數(shù)是男性,偶數(shù)是女性
18 位:代表校驗(yàn)碼,如果是0-9則用0-9表示,如果是10則用X(羅馬數(shù)字10)表示

注:另外有些15位的身份證號(hào)碼,年份使用2位數(shù)字表示的,并且沒有最后一位校驗(yàn)碼;從1999年10月1日起,全國實(shí)行公民身份證號(hào)碼制度,居民身份證編號(hào)由原15位升至18位,所以可以確定15位身份證號(hào)碼的都是19xx年出生的

前17位的驗(yàn)證在這里就不多講解,重點(diǎn)講解一下最后一位校驗(yàn)碼的驗(yàn)證,最后一位校驗(yàn)碼等于前17位根據(jù)每一位的權(quán)重的乘積之和再除以11的余數(shù),這里等會(huì)看代碼解釋
前17位每一位的的權(quán)重如下:
{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}

主要代碼如下

/*** 驗(yàn)證結(jié)果類** @author liujingxing on 16/07/17.*/ public class Result {/*** 錯(cuò)誤消息,為空時(shí),代表驗(yàn)證通過*/private String error;public boolean isLegal() {//兩個(gè)變量為默認(rèn)值,即認(rèn)為是合法的return error == null || error.equals("");}public String getError() {return error;}public void setError(String message) {this.error = message;}public void show(Context context) {if (!isLegal())Toast.makeText(context, error, Toast.LENGTH_SHORT).show();} } /*** 身份證驗(yàn)證工具,只需要調(diào)用靜態(tài)方法 validateIDNum(String) 傳入身份證即可** @author liujingxing by 2016/07/17* @see #validateIDNum(String)*/ public class IDCardUtil {private final static int[] FACTOR = new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8,4, 2};public static Result validateIDNum(String idNum) {Result result = new Result();// 記錄驗(yàn)證結(jié)果//判斷身份證是否為空if (TextUtils.isEmpty(idNum)) {result.setError("身份證號(hào)碼不能為空");return result;}//身份證號(hào)碼的長度只能為15位或18位int idNumLength = idNum.length();if (idNumLength != 15 && idNumLength != 18) {result.setError("身份證號(hào)碼應(yīng)該為15位或18位");return result;}//對(duì)身份證的字符做判斷if (!isAllNum(idNum)) {result.setError(idNum.length() == 18 ? "18位號(hào)碼除最后一位外,都應(yīng)為數(shù)字" : "15位號(hào)碼都應(yīng)為數(shù)字");return result;}if (idNum.contains("x")) {result.setError("身份證x必須為大寫");return result;}//判斷地區(qū)編碼Hashtable<String, String> h = getAreaCode();if (h.get(idNum.substring(0, 2)) == null) {result.setError("身份證地區(qū)編碼錯(cuò)誤");return result;}// 出生年月是否有效String idNum17;if (idNum.length() == 18) {idNum17 = idNum.substring(0, 17);} else {//如果是15為身份證則加上出生年代:19idNum17 = idNum.substring(0, 6) + "19" + idNum.substring(6, 15);}String strYear = idNum17.substring(6, 10);// 年份String strMonth = idNum17.substring(10, 12);// 月份String strDay = idNum17.substring(12, 14);// 月份if (!validateDate(strYear + "-" + strMonth + "-" + strDay)) {result.setError("身份證生日無效");return result;}GregorianCalendar gc = new GregorianCalendar();SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());try {if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150 || (gc.getTime().getTime()- format.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {result.setError("身份證生日不在有效范圍");return result;}} catch (NumberFormatException | java.text.ParseException e) {e.printStackTrace();}//18位的身份證對(duì)最后一位校驗(yàn)碼進(jìn)行驗(yàn)證if (idNum.length() == 18 && !isCorrectID(idNum)) {result.setError("身份證無效,不是合法的身份證號(hào)碼");return result;}return result;}/*** 功能:設(shè)置地區(qū)編碼*/private static Hashtable<String, String> getAreaCode() {Hashtable<String, String> hashTable = new Hashtable<>();hashTable.put("11", "北京");hashTable.put("12", "天津");hashTable.put("13", "河北");hashTable.put("14", "山西");hashTable.put("15", "內(nèi)蒙古");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", "臺(tái)灣");hashTable.put("81", "香港");hashTable.put("82", "澳門");hashTable.put("91", "國外");return hashTable;}/*** 判斷身份證字符是否合法*/private static boolean isAllNum(String idNum) {String match = idNum.length() == 18 ? "^[0-9]{17}([0-9]|X)$" : "^[0-9]{15}$";Pattern pattern = Pattern.compile(match);Matcher isNum = pattern.matcher(idNum);return isNum.matches();}/*** 功能:判斷字符串是否為日期格式*/private static boolean validateDate(String strDate) {Pattern pattern = Pattern.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$");Matcher m = pattern.matcher(strDate);return m.matches();}/*** 判斷輸入的身份證是否合法** @param idNum 18位的身份證號(hào)* @return 合法true,反之false*/private static boolean isCorrectID(String idNum) {boolean flag = false;if (idNum == null || idNum.trim().length() != 18) {return false;}String last = getLastNumOfID(idNum.substring(0, idNum.length() - 1));if (last.equals(String.valueOf(idNum.charAt(idNum.length() - 1)))) {flag = true;}return flag;}/*** 根據(jù)前17位身份證號(hào),算出第18位數(shù)字** @param id17 前17位身份證號(hào)* @return 第18位身份證號(hào)對(duì)應(yīng)的數(shù)字*/private static String getLastNumOfID(String id17) {int sum = sumFactor(id17);String res;if (sum == -1) {res = "輸入的身份證為空";} else if (sum == -3) {res = "輸入的身份證號(hào)碼不為17位";} else {int mod = sum % 11;int last = (12 - mod) % 11;if (last == 10) {res = "X";//X代表羅馬數(shù)字10} else {res = String.valueOf(last);}}return res;}/*** 計(jì)算前17位身份證號(hào)乘以各個(gè)數(shù)的權(quán)重的總和** @param id17 前17位身份證號(hào)* @return 權(quán)重的總和*/private static int sumFactor(String id17) {if (id17 == null || id17.trim().equals("")) {return -1; //輸入的身份證為空}int len = id17.length();if (len != 17) {return -3; //輸入的身份證號(hào)碼不為17位}int sum = 0;for (int i = 0; i < len; i++) {sum += FACTOR[i] * Integer.parseInt(String.valueOf(id17.charAt(i)));}return sum;} }

以上代碼都很簡(jiǎn)單,在這講解一下身份證驗(yàn)證步驟
第一步:驗(yàn)證身份證位數(shù)夠不夠
第二步:驗(yàn)證身份證有沒有除數(shù)字以外的字符(18位身份證最后一位X除外)
第三步:驗(yàn)證前兩位省份編碼對(duì)不對(duì)
第四步:驗(yàn)證7-14位出生日期在不在范圍內(nèi)
第五步:驗(yàn)證最后一位校驗(yàn)碼對(duì)不對(duì)

如以上五步都通過了驗(yàn)證,那么就可以說明身份證是合法的,其中任何一步驗(yàn)證出錯(cuò),都會(huì)有相應(yīng)的提示信息

總結(jié)

以上是生活随笔為你收集整理的Android、Java超详细的身份证验证工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。