1. 程式人生 > >Java校驗輸入的身份證號

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

javaAPI(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