教你如何正確的去校驗身份證
//判斷身份證的參考標準:
要麼是15位,要麼是18位,最後一位可以為字母,並寫程式提出其中的年月日。
身份證的構成:
身份證號碼驗證
- 1、號碼的結構 公民身份號碼是特徵組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼, 八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。
- 2、地址碼(前六位數) 表示編碼物件常住戶口所在縣(市、旗、區)的行政區劃程式碼,按GB/T2260的規定執行。
- 3、出生日期碼(第七位至十四位) 表示編碼物件出生的年、月、日,按GB/T7408的規定執行,年、月、日程式碼之間不用分隔符。
- 4、順序碼(第十五位至十七位) 表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號, 順序碼的奇數分配給男性,偶數分配給女性。
- 5、校驗碼(第十八位數)
- (1)十七位數字本體碼加權求和公式 S = Sum(Ai * Wi), i = 0, … , 16 ,先對前17位數字的權求和 Ai:表示第i位置上的身份證號碼數字值 Wi:表示第i位置上的加權因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
- (2)計算模 Y = mod(S, 11)
- (3)通過模得到對應的校驗碼 Y: 0 1 2 3 4 5 6 7 8 9 10 校驗碼: 1 0 X 9 8 7 6 5 4 3 2
其相關正則表示式為
Pattern idNumPattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])" );
//通過Pattern獲得Matcher
Matcher idNumMatcher = idNumPattern.matcher(idNum);
//判斷使用者輸入是否為身份證號
iidNumMatcher.matches()
工具類封裝
public class CheckCID {
/**
* 身份證驗證
* @param idCard
* @return
*/
public static boolean isIdCard(String idCard) {
if (idCard==null||"".equals(idCard))return false;
if("".equals(validateIDCard(idCard)))return true;
return false;
}
/*********************************** 身份證驗證開始 ****************************************
/**
* 功能:身份證的有效驗證
*
* @param IDStr
* 身份證號
* @return 有效:返回"" 無效:返回String資訊
*/
@SuppressWarnings("unchecked")
public static String validateIDCard(String cidStr) {
if(cidStr==null)return null;
String IDStr=cidStr.toLowerCase();
String errorInfo = "";// 記錄錯誤資訊
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 (IDStr.length() != 15 && IDStr.length() != 18) {
errorInfo = "身份證號碼長度應該為15位或18位";
return errorInfo;
}
// =======================(end)========================
// ================ 數字 除最後以為都為數字 ================
if (IDStr.length() == 18) {
Ai = IDStr.substring(0, 17);
} else if (IDStr.length() == 15) {
Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);
}
if (isNumeric(Ai) == false) {
errorInfo = "身份證15位號碼都應為數字 ; 18位號碼除最後一位外,都應為數字";
return errorInfo;
}
// =======================(end)========================
// ================ 出生年月是否有效 ================
String strYear = Ai.substring(6, 10);// 年份
String strMonth = Ai.substring(10, 12);// 月份
String strDay = Ai.substring(12, 14);// 月份
if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
errorInfo = "身份證生日無效";
return errorInfo;
}
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) {
errorInfo = "身份證生日不在有效範圍";
return errorInfo;
}
}catch (Exception e) {
errorInfo = "身份證生日不在有效範圍";
return errorInfo;
}
if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
errorInfo = "身份證月份無效";
return errorInfo;
}
if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
errorInfo = "身份證日期無效";
return errorInfo;
}
// =====================(end)=====================
// ================ 地區碼時候有效 ================
Hashtable h = GetAreaCode();
if (h.get(Ai.substring(0, 2)) == null) {
errorInfo = "身份證地區編碼錯誤";
return errorInfo;
}
// ==============================================
// ================ 判斷最後一位的值 ================
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 (IDStr.length() == 18) {
if (Ai.equals(IDStr) == false) {
errorInfo = "身份證無效,不是合法的身份證號碼";
return errorInfo;
}
} else {
return "";
}
// =====================(end)=====================
return "";
}
/**
* 功能:設定地區編碼
*
* @return Hashtable 物件
*/
@SuppressWarnings("unchecked")
private static Hashtable GetAreaCode() {
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 str
* @return
*/
private static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (isNum.matches()) {
return true;
} else {
return false;
}
}
/**
* 功能:判斷字串是否為日期格式
*
* @param str
* @return
*/
private static boolean isDate(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);
if (m.matches()) {
return true;
} else {
return false;
}
}
}
相關身份證識別學習文件
原始碼下載地址
如果你覺得此文對您有所幫助,歡迎入群 QQ交流群 :232203809
微信公眾號:終端研發部
(歡迎關注學習和交流)
相關推薦
教你如何正確的去校驗身份證
//判斷身份證的參考標準: 要麼是15位,要麼是18位,最後一位可以為字母,並寫程式提出其中的年月日。 身份證的構成: 身份證號碼驗證 1、號碼的結構 公民身份號碼是特徵組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數
18位身份證號藏了什麼玄機?用js教你校驗身份證
大家好,想必各位程式猿已經有所發現,而相應地,在日常的開發任務需求了很多跟涉及到使用者的都幾乎需
SpringBoot啟動的時候不去校驗數據庫連接配置是否正確
div exc 程序 == cati 檢驗 配置 source implement spring boot在啟動的時候只會檢查你是否配置了數據庫連接, 而不會檢測配置的是否正確 這樣會出現的問題是: 只有在你使用數據庫的時候才知道配置出錯, 我們希望是在程序啟動的時候就進行
校驗身份證是否正確
package com.gc.action; public class Test { public static void main(String[] args) { String
js 校驗身份證號碼是否正確(摘抄整理)
/* 根據〖中華人民共和國國家標準 GB 11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。 地址碼錶示編碼物件常住戶口
校驗身份證有效性
blog fun for return 計算 base == arch 特殊 1 /** 2 * 驗證身份證格式有效性 3 * @param type $id_card 4 * @return boolean 5 */ 6 function valid
一個完整校驗身份證
一個完整校驗身份證 /** * 校驗身份證號合法性 */ function checkIdNumberValid(tex){ var tip = '輸入的身份證號有誤,請檢查後重新輸入!'; var num = tex.value; num = num.toUpperCase()
校驗身份證號碼
校驗身份證是否正確,必須是二代身份證,身份證號是18位 /** * 驗證18位身份編碼是否合法 * * @param idCard 身份編碼 * @return 是否合法 */ public static boolean val
迅捷OCR文字識別軟件教你如何去識別票證
adc 結束 一個 窗口 圖片文字 開始 nag pro 打開文件 識別票證在生活中應用到的場景非常多,大家普遍都是借助圖片文字識別軟件去進行掃描識別的,但是還有一些人不知道該怎樣票證識別請添加鏈接描述,下面小編就來為大家講解一下具體的操作方法。 步驟一、首先識別票據的
java 校驗身份證
/** * 校驗身份證 * * @param idCard * @return 校驗通過返回true,否則返回false */ public
教你怎麼樣去複製百度文庫中的文章
方法/步驟 首先,我們按照平時的搜尋習慣,在百度文庫中找到自己需要的資料。 文章不可以複製,但有的題目可以複製,把可以複製的題目複製下來。
js 校驗身份證號
根據地區編碼、身份證格式、18位身份證需要驗證最後一位校驗位 //校驗身份證 function IdentityCodeValid(code) { var city = { 11: "北京", 12: "天津",
教你正確的學習web前端開發技術的方法分享
近幾年IT業可謂是發展火熱,而且新生了很多的職業。例如安卓開發工程師、iOS開發工程師。在這眾多的新生職業中備受矚目的當屬web前端工程師了,前端工程師薪資高,就業發展前景好,更多的人選擇了這一職業成為自己的發展方向,想要自己成為一名合格的web前端工程師,web前端開發學習路線圖值得大家去看看。
教你如何去選個人微訊號管理軟體的妙招神手CRM
現在很多企業都已經加入到微信營銷的佇列,依靠微信作為第一社交軟體的溝通優勢,配合銷售加速客戶轉化。隨著微信營銷的深入,新的問題也隨之而來,微信賬號過多管理混亂、銷售私加客戶損害公司利益...個人微訊號管理刻不容緩。但現在市面上的個人微訊號管理軟體品類繁多,企業不知道該如何選擇。今天小編就給
六個例項教你正確使用Java內部類(成員內部類、匿名內部類、靜態內部類、區域性內部類)
內部類不是很好理解,但說白了其實也就是一個類中還包含著另外一個類 如同一個人是由大腦、肢體、器官等身體結果組成,而內部類相當於其中的某個器官之一,例如心臟:它也有自己的屬性和行為(血液、跳動) 顯然,此處不能單方面用屬性或者方法表示一個心臟,而需要一個類
JS校驗身份證號碼
function isIdCardNo(num) { num = num.toUpperCase(); //身份證號碼為15位或者18位,15位時全為數字,18位前17位為數字,最後一位是校驗位,可能為數字或字元X。
使用更流暢 手把手教你正確設定虛擬記憶體
最近大家都經常談論的話題,就是DDR記憶體的大降價,DDR266從400多元的位置暴跌到200元左右,很多人都用上了512MB甚至1GB的記憶體,於是有一種觀點也在部分玩家中流行起來,說是禁用虛擬記憶體、禁止Windows頁面檔案交換、強行命令資料在記憶體中處理,可以加快資
Android表單校驗器,讓你的文字校驗清晰化
對於一般專案的業務層,註冊頁的輸入框都密密麻麻,對輸入文字的檢驗也千奇百怪,在應對多個文字框文字進行判斷時,總是if、else不僅讓我們的程式碼寫的過長,而且有時又會造成邏輯混亂,這時我們移動端可以採用表單的模式把當前模組中的所有文字框放入一個表單校驗器中,統一進行驗證處理
辦公郵箱×××,教你正確選擇好用的辦公郵箱
郵箱 ××× 專業 緊急 工具 技術 ima 安全 情況 做外貿業務的人通常很看重合作對象的細節與實力,在日常溝通中,郵箱就成了很好的工具,而最讓人頭疼的莫過於跟客戶進行郵件往來時遇到諸如退信,郵件進入對方的垃圾箱等問題,這些都將影響與客戶溝通。對於外貿人來說,擁有一個好用
JS嚴格校驗身份證號
以下是根據身份證號碼編碼規則,使用JS對其進行有效性驗證程式碼<script type="text/javascript"> var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];