Java校驗輸入的身份證號
在程式中我們總免不了對使用者輸入的資料進行上層校驗,將格式不正確的資料直接攔截在呼叫整個方法之前,這樣不僅能讓使用者很明確地知道自己輸入的資料是否正確,錯誤的原因,還一定程度上提高了方法的效率。小編在最近的工作中,整理了關於身份證號的驗證方式:
I 使用最樸實的Java程式碼實現
我們都知道身份證號的組成受地區、出生年月的影響,所以工具類中自然少不了對這兩個要素的判斷:
但是技術總是發展的,從某天開始,攻城獅們獲得了一項福利--可以將上述繁雜的程式碼使用一個表示式來概括,那就是 正則表示式:// 地區集合 final static Map<Integer, String> zoneNum = new HashMap<Integer, String>(); static { zoneNum.put(11, "北京"); zoneNum.put(12, "天津"); zoneNum.put(13, "河北"); zoneNum.put(14, "山西"); zoneNum.put(15, "內蒙古"); zoneNum.put(21, "遼寧"); zoneNum.put(22, "吉林"); zoneNum.put(23, "黑龍江"); zoneNum.put(31, "上海"); zoneNum.put(32, "江蘇"); zoneNum.put(33, "浙江"); zoneNum.put(34, "安徽"); zoneNum.put(35, "福建"); zoneNum.put(36, "江西"); zoneNum.put(37, "山東"); zoneNum.put(41, "河南"); zoneNum.put(42, "湖北"); zoneNum.put(43, "湖南"); zoneNum.put(44, "廣東"); zoneNum.put(45, "廣西"); zoneNum.put(46, "海南"); zoneNum.put(50, "重慶"); zoneNum.put(51, "四川"); zoneNum.put(52, "貴州"); zoneNum.put(53, "雲南"); zoneNum.put(54, "西藏"); zoneNum.put(61, "陝西"); zoneNum.put(62, "甘肅"); zoneNum.put(63, "青海"); zoneNum.put(64, "新疆"); zoneNum.put(71, "臺灣"); zoneNum.put(81, "香港"); zoneNum.put(82, "澳門"); zoneNum.put(91, "外國"); } final static int[] PARITYBIT = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; final static int[] POWER_LIST = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; /** * 身份證號是否合理的校驗 * * @param certNo * @return */ public static boolean isIDCard(String certNo) { if (certNo == null || (certNo.length() != 15 && certNo.length() != 18)) return false; final char[] cs = certNo.toUpperCase().toCharArray(); // 校驗位數 int power = 0; for (int i = 0; i < cs.length; i++) { if (i == cs.length - 1 && cs[i] == 'X') break;// 最後一位可以 是X或x if (cs[i] < '0' || cs[i] > '9') return false; if (i < cs.length - 1) { power += (cs[i] - '0') * POWER_LIST[i]; } } // 校驗區位碼 if (!zoneNum.containsKey(Integer.valueOf(certNo.substring(0, 2)))) { return false; } // 校驗年份 String year = certNo.length() == 15 ? getIdcardCalendar() + certNo.substring(6, 8) : certNo.substring(6, 10); final int iyear = Integer.parseInt(year); if (iyear < 1900 || iyear > Calendar.getInstance().get(Calendar.YEAR)) return false;// 1900年的PASS,超過今年的PASS // 校驗月份 String month = certNo.length() == 15 ? certNo.substring(8, 10) : certNo.substring(10, 12); final int imonth = Integer.parseInt(month); if (imonth < 1 || imonth > 12) { return false; } // 校驗天數 String day = certNo.length() == 15 ? certNo.substring(10, 12) : certNo.substring(12, 14); final int iday = Integer.parseInt(day); if (iday < 1 || iday > 31) return false; // 校驗"校驗碼" if (certNo.length() == 15) return true; return cs[cs.length - 1] == PARITYBIT[power % 11]; } /** * 獲取身份證號中的年月日 * * @return */ private static int getIdcardCalendar() { GregorianCalendar curDay = new GregorianCalendar(); int curYear = curDay.get(Calendar.YEAR); int year2bit = Integer.parseInt(String.valueOf(curYear).substring(2)); return year2bit; }
II 正則表示式:
在開發的工作中,我們應該儘量地提高程式碼的精煉程度,相比之下,小編還是比較傾向於正則表示式,畢竟兩種方式的程式碼量差距實在太大了。不過上面都是小編的個人見解,希望能幫大家在進行資料校驗的過程中解決疑惑,縮短查閱的時間!!public static boolean verifyIdCard(String idCard){ String strVerify = "(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}(\\d|x|X)$)|(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)"; Pattern p = Pattern.compile(strVerify); Matcher m = p.matcher(idCard); return m.find(); }
相關推薦
Java校驗輸入的身份證號
在程式中我們總免不了對使用者輸入的資料進行上層校驗,將格式不正確的資料直接攔截在呼叫整個方法之前,這樣不僅能讓使用者很明確地知道自己輸入的資料是否正確,錯誤的原因,還一定程度上提高了方法的效率。小編在最近的工作中,整理了關於身份證號的驗證方式: I 使用最樸實的Ja
java 校驗身份證
/** * 校驗身份證 * * @param idCard * @return 校驗通過返回true,否則返回false */ public
身份證號碼校驗 java校驗
最近在身份證認證的時候,需要對身份證號碼進行校驗。這裡進行記錄下 package com.ptpl.web.util; /** * 身份證前6位【ABCDEF】為行政區劃數字程式碼(簡稱數字碼)說明(參考《GB/T 2260-2007 中華人民共和國行政區劃程式碼》)
Java使用luhn校驗演算法實現銀行卡號合法性校驗&&獲取銀行卡號所屬銀行
Luhn校驗演算法或是Luhn 公式,也被稱作“模10演算法”。它是一種簡單的校驗公式,一般會被用於身份證號碼,IMEI號碼,美國供應商識別號碼, 或是加拿大的社會保險號碼的驗證。該演算法是由IBM的科學家Hans Peter Luhn所創造,於1954年1月6日提出該
前端JS校驗銀行卡卡號和身份證號碼(附ES6版方法)
var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加權因子 var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]; // 身份證驗證位值.10代表X funct
java校驗身份證的合法性
一、判斷身份證合法性的規則 1、首先先科普一下身份證號碼的數字代表什麼? 根據〖中華人民共和國國家標準GB11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。 排列順序從左
Java工具類實現校驗公民身份證的有效性
package com.api.util; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Map;
java 校驗15位或18位身份證號碼
package com.first.common.utility.idcard; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java
java 校驗圖片的大小、尺寸、比例
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class CheckImagesFormat
PHP怎麼校驗一個身份證是否正確
首先來介紹一下身份證號碼的組成,前往:第二代身份證號碼編排規則 程式碼如下 $str = '51032219990808473x'; function checkIdCard($idCard) { if (strlen($idCard) !== 18) {
java 校驗一個字串是否是手機號碼
public static boolean isMobileNO(String mobiles) { String telRegex = "[1][3578]\\d{9}"; // "[1]"代表第1位為數字1,"[357
java校驗API(Hibernate Validator)
hibernate Validator 是 Bean Validation 的參考實現 。Hibernate Validator 提供了 JSR 303 規範中所有內建 constraint 的實現,除此之外還有一些附加的 constraint。 在日常開發中,Hib
[Java原始碼]鍵盤輸入會員卡號,對其格式、位數進行判斷,不符合規則會跳轉重新輸入
4位數的會員卡號,活動期間,4位數字求平均值為5,則商品免費 -----------------------背景-------------------------------分割線--------------------------------------------------- 下面一段
在QTavleView中新增QLineEdit(用正則表示式校驗輸入的IP地址)
在QTableView中新增QLineEdit,並且該QLineEdit是需要填入IP地址,因此輸入的資料必須遵循IP地址的規則。這時可以使用QT中的委託。 委託的一篇文章http://blog.csdn.net/hello_world_lvlcoder/article
java 校驗經緯度
只校驗正數 0-90.000000 0-180.000000 範圍內 /** * 經緯度校驗 * 經度longitude: (?:[0-9]|[1-9][0-9]|1[0-7][0-9]|180)\
傳送簡訊驗證碼時間控制,手機號校驗,證件號校驗
//傳送驗證碼 var countdown=60; function sendmsg(){ timeset(); &nbs
輸入身份證號,出生年月日、性別、判斷其地區
一、首先弄清楚一些東西: 15位的舊身份證,最後一個數是單數的為男,雙數的為女。 18位的新身份證,倒數第二位是單數的為男,雙數的為女。 校驗的計算方式: 1. 對前17位數字本體碼加權求和 公式為:S = Sum(Ai * Wi), i = 0, .
Java 校驗EMAIL格式方法,真為正確
/** * 校驗EMAIL格式,真為正確 * * @author * @date 2017-7-19 * @param email * @return true 為格式正確 false
JAVA校驗和演算法的實現
其校驗和為1+2+3=6。與另一種常用的校驗方式CRC校驗相比,校驗和實現簡單,但其校驗的精確度相比CRC稍差。如果不是對資料的準確性要求特別高的使用場合,校驗和都是一種不錯的短資料校驗方式。校驗和在Java下的實現方式如下:
Java校驗時間段重疊
com tin return amp urn pri 條件查詢 實體 list數據 1.需求 要求保存每一條數據的startTime、endTime的中間時間段是唯一的,跟其他數據時間段不能存在沖突 比如: (2019-03-01 -> 2019-03-03