1. 程式人生 > >身份證轉換工具類(Java)

身份證轉換工具類(Java)

工作中經常涉及到對身份證資訊進行關操作的演算法,特此整理出來分享。

  • 15位的身份證號碼轉換成18位
  • 18位的身份證號碼轉換成15位
  • 傳入18位的身份證號,得到生日
  • 根據身份證號碼獲取年齡
  • 傳入身份證號,得到性別
  • 傳入身份證號,獲取出生年份
  • 判斷輸入的身份證號碼是否符合身份證號的要求
package com.test;

import java.util.Calendar;

/**
 * 身份證轉換工具類
 * 
 * <P>
 * 第十八位數字的計算方法為:
 * </P>
 * <P>
 * 1.將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2;
 * 2.將這17位數字和係數相乘的結果相加; 3.用加出來和除以11,看餘數是多少? 4餘數只可能有0 1 2 3 4 5 6 7 8 9
 * 10這11個數字。其分別對應的最後一位身份證的號碼為1 0 X 9 8 7 6 5 4 3 2;
 * 5.通過上面得知如果餘數是2,就會在身份證的第18位數字上出現羅馬數字的Ⅹ。如果餘數是10,身份證的最後一位號碼就是2。
 * </P>
 */
public class IDCardUtil {
	/**
	 * 15位的身份證號碼轉換成18位
	 * @param idCardNo15 待轉換的 15 位身份證號碼
	 * @return
	 */
	public static String from15to18(String idCardNo) {
		String finalID = null;// 最終的ID
		if (!isIdCardNo(idCardNo))
			throw new IllegalArgumentException("您輸入的身份證號碼不正確:" + idCardNo);
		String century = "19";
		if (idCardNo.length() == 18) {
			finalID = idCardNo;
		} else {
			// 對應的17位的各個係數
			int[] weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
					5, 8, 4, 2 };

			// 通過加入世紀碼, 變成 17 位的新號碼本體.
			String tempNo = idCardNo.substring(0, 6) + century
					+ idCardNo.substring(6);

			// 下面算最後一位校驗碼
			int checkSum = 0;
			for (int i = 0; i < weight.length; i++) {
				int ai = Integer.parseInt("" + tempNo.charAt(i)); // 位於 i 位置的數值
				checkSum = checkSum + ai * weight[i];
			}
			// 求餘數
			int checkNum = checkSum % 11;
			String lastNumber = null;
			switch (checkNum) {
			case 0:
				lastNumber = "1";
				break;
			case 1:
				lastNumber = "0";
				break;
			case 2:
				lastNumber = "X";
				break;
			case 3:
				lastNumber = "9";
				break;
			case 4:
				lastNumber = "8";
				break;
			case 5:
				lastNumber = "7";
				break;
			case 6:
				lastNumber = "6";
				break;
			case 7:
				lastNumber = "5";
				break;
			case 8:
				lastNumber = "4";
				break;
			case 9:
				lastNumber = "3";
				break;
			case 10:
				lastNumber = "2";
				break;
			}
			finalID = tempNo + lastNumber;
		}

		return finalID;

	}

	/**
	 * 18位的身份證號碼轉換成15位
	 * @param idCardNo18
	 * @return
	 */
	public static String from18to15(String idCardNo18) {
		if (!(isIdCardNo(idCardNo18) && idCardNo18.length() == 18)) {
			throw new IllegalArgumentException("身份證號引數格式不正確!");
		}
		return idCardNo18.substring(0, 6) + idCardNo18.substring(8, 17);
	}

	/**
	 * 傳入18位的身份證號,得到生日,格式:19880101
	 * @param idCardNo18
	 * @return
	 */
	public static String getBirthday(String idCardNo18) {
		return idCardNo18.substring(6, 14);
	}

	/**
	 * 根據身份證號碼獲取年齡
	 * @param idCardNo18
	 * @return
	 */
	public static int getAge(String idCardNo18) {
		idCardNo18 = from15to18(idCardNo18);
		// 當前年份
		Calendar instance = Calendar.getInstance();
		int currentYear = instance.get(Calendar.YEAR);
		int age = currentYear - Integer.parseInt(getBirthYear(idCardNo18));
		return age;
	}

	/**
	 * 傳入身份證號,得到性別
	 * @param idCardNo18
	 * @return
	 */
	public static String getSex(String idCardNo18) {
		idCardNo18 = from15to18(idCardNo18);
		// 定位到倒數第二位
		char c = idCardNo18.charAt(16);
		String sex = "";
		if (c % 2 != 0) {
			sex = "男";
		} else {
			sex = "女";
		}
		return sex;
	}

	/**
	 * 傳入身份證號,獲取出生年份
	 * @param idCardNo18
	 * @return
	 */
	private static String getBirthYear(String idCardNo18) {
		return idCardNo18.substring(6, 10);
	}

	/**
	 * 判斷輸入的身份證號碼是否符合身份證號的要求
	 * @param idCardNO
	 * @return
	 */
	public static boolean isIdCardNo(String idCardNO) {
		boolean isID = false;
		if (idCardNO == null)
			return false;
		int len = idCardNO.length();
		if (len != 15 && len != 18) {
			isID = false;
		} else {
			// 排除最後一位是:X的情況
			for (int i = 0; i < len; i++) {
				try {
					if (i < len - 1)
						Integer.parseInt("" + idCardNO.charAt(i));
					else if ((idCardNO.charAt(i) + "").equalsIgnoreCase("X")
							|| Integer.parseInt("" + idCardNO.charAt(i)) > -1)
						isID = true;
					else
						isID = false;
				} catch (NumberFormatException e) {
					return false;
				}
			}
		}
		return isID;
	}

	public static void main(String[] args) {
		System.out.println(getSex(from15to18("110104830512301")));
	}
}


相關推薦

身份證轉換工具(Java)

工作中經常涉及到對身份證資訊進行關操作的演算法,特此整理出來分享。 15位的身份證號碼轉換成18位18位的身份證號碼轉換成15位傳入18位的身份證號,得到生日根據身份證號碼獲取年齡傳入身份證號,得到性別傳入身份證號,獲取出生年份判斷輸入的身份證號碼是否符合身份證號的要求

Java時間格式轉換工具

string stact 修改 stack time mil 日期格式轉換 pla gettime 把當前時間修改成指定時間 //把當前時間修改成指定時間 public String dateUtil(Integer seconds, String dateFo

Java中將字符串與unicode的相互轉換工具

png style nic ava param 字符串拼接 size tostring info unicode編碼規則 unicode碼對每一個字符用4位16進制數表示。具體規則是:將一個字符(char)的高8位與低8位分別取出,轉化為16進制數,如果轉化的16進制數的長

xstream--xml工具--java物件轉換JSONObject、xml與java物件互轉

工作環境: myeclipse2013、jdk1.8、fastjson1.1.41、xstream1.4.3 import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Writer;

java json轉換工具

在java專案中,通常會用到json型別的轉換,常常需要對 json字串和物件進行相互轉換。 在製作自定義的json轉換類之前,先引入以下依賴 <!--json解析工具--> <dependency> <groupId>com.fasterx

Java 資料轉換/進位制轉換 工具

package com.yunduan.parking.util; import java.math.BigInteger; import java.util.regex.Pattern; /** * Created by Administrator on 2018/8/15. */ p

java位元組字元轉換工具

該工具類作用是位元組,字元陣列的相互轉換(避免重複造輪子),分享給大家 public class ConvertUtil {     /**      * 位元組陣列轉16進位制字串    &

Java生成隨機數工具,進位制之間的轉換工具,獲取指定時間,時間格式轉換工具

廢話不多說,貢獻一下code 1.編號生成工具 import org.apache.commons.lang3.StringUtils; import java.math.BigInteger; import java.text.SimpleDa

java中unicode utf-8以及漢字之間的轉換工具

1.       漢字字串與unicode之間的轉換 1.1          stringToUnicode /** * 獲取字串的unicode編碼 * 漢字“木”的Unicode 碼點為Ox6728 * * @param s 木 * @return \uf

Java 身份證驗證工具程式碼模板

package com.demo.common.pojo;  import java.text.ParseException;  import java.text.SimpleDateFormat;  import java

java時間戳轉換工具

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** *

java 中 byte[]、File、InputStream 互相轉換工具

java 中 byte[]、File、InputStream 互相轉換1、將File、FileInputStream 轉換為byte陣列:File file = new File("test.txt");InputStream input = new FileInputSt

Java 物件和xml轉換工具

package com.mcp.util; import org.apache.commons.lang3.StringUtils; import java.io.StringReader; import java.io.StringWriter; import j

java資料型別相互轉換工具

package com.rest.ful.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /**

java 物件與json字串互相轉換工具

                需要引入的jar包: JsonUtil.java檔案: package

java時間轉換工具

package com.ikcrm.lib.common.utils; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java

我的Android進階之旅------>Java檔案大小轉換工具 (B,KB,MB,GB,TB,PB之間的大小轉換)

Java檔案大小轉換工具類 (B,KB,MB,GB,TB,PB之間的大小轉換) 有時候要做出如下所示的展示檔案大小的效果時候,需要對檔案大小進行轉換,然後再進行相關的程式碼邏輯編寫。 /*** * 儲存大小(單位)轉換器. */

Java 型別轉換 工具

public class TypeCastHelper { private static final String DEFAULT_STRING = ""; private static final int DEFAULT_INT = 0; priv

Java身份證號碼工具

package com.pqs.common.tools; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.

利用Thumbnails,java圖片壓縮,轉換工具

Thumbnails是谷歌的一個圖片壓縮處理開源庫。利用這個庫可以非常容易的做圖片處理。這裡整理了一些方法。直接看程式碼吧。 先新增jar支援 <!-- https://mvnrepository.com/artifact/net.coobird/thumbnail