java js 身份證號碼處理

        使用java將20年代的中國15位身份證號轉換爲18位的身份證號。java

/**
 * 身份證轉換,15位身份證轉換成18位身份證
 * @author Arthur126
 * @date 2015-8-21 下午11:06:52 
 *
 */
public class TransformId {

    /**
     * 把15位身份證號轉換成18位身份證號碼
     * 出生月份前加"19"(20世紀才使用的15位身份證號碼),最後一位加校驗碼
     * @param custNo
     * @return
     */
    public static String transformIdFrom15To18(String custNo) {
        String idCardNo = null;
        if (custNo != null && custNo.trim().length() == 15) {
            custNo = custNo.trim();
            StringBuffer newIdCard = new StringBuffer(custNo);
            newIdCard.insert(6, "19");
            newIdCard.append(trasformLastNo(newIdCard.toString()));
            idCardNo = newIdCard.toString();
        }

        return idCardNo;
    }

    /**
     * 生成身份證最後一位效驗碼
     * @param id
     * @return
     */
    private static String trasformLastNo(String id) {
        char pszSrc[] = id.toCharArray();
        int iS = 0;
        int iW[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
        char szVerCode[] = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
        int i;
        for (i = 0; i < id.length(); i++) {
            iS += (pszSrc[i] - '0') * iW[i];
        }
        int iY = iS % 11;

        return String.valueOf(szVerCode[iY]);
    }

    public static void main(String[] args) {
        // 610203198401266361
        System.out.println(TransformId.transformIdFrom15To18("610203840126636"));
        // 130406198903018347
        System.out.println(TransformId.transformIdFrom15To18("130406890301834"));
    }
}

       

        使用JavaScript將20年代的中國15位身份證號轉換爲18位的身份證號。apache

    /**
     * 將15位身份證號碼轉換爲18位
     * @param {} idCardNo
     */
    transformatIdFrom15To18 : function(idCardNo) {
		var v = new Array(2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2, 4, 8, 5, 10, 9, 7);
		var vs = "10X98765432";
		if (idCardNo == null || pf.trim(idCardNo).length != 15) {
			return "";
		}
		idCardNo = pf.trim(idCardNo);
		// 將15位的號碼轉換位17位
		var cardID17 = idCardNo.substring(0, 6) + "19" + idCardNo.substring(6);
		var N = 0;
		var R = -1;
		var T = '0';// 儲存最後一個數字
		var j = 0;
		var cardID18 = "";
		// 計數出第18位數字
		for (var i = 16; i >= 0; i--) {
			N += parseInt(cardID17.substring(i, i + 1)) * v[j];
			j++;
		}
		R = N % 11;
		T = vs.charAt(R);
		cardID18 = cardID17 + T;
		return cardID18;
	}

附一個java編寫的身份證號碼處理工具類IdCardUtil:app

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * 身份證工具類
 */
public class IdCardUtil {

	/**
	 * 區域編碼
	 */
	private static final String AREA_CODE = "11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,";

	public static void main(String[] args) throws ParseException {
		// System.out.println(checkIdCard("210102610334445"));
		// System.out.println(checkIdCard("21010219610324445X"));
		System.out.println(transIdFrom15To18("342422890202641"));
	}

	/**
	 * 身份證號碼正確性校驗(含15位和18位)
	 * 
	 * @param idCard
	 * @return
	 */
	public static boolean checkIdCard(String idCard) {
		Pattern pattern_15 = Pattern.compile("^[0-9]{8}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}$");
		Pattern pattern_18 = Pattern
				.compile("^[0-9]{6}(18|19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}([0-9]|X)$");
		// 長度判斷
		if (idCard != null && (idCard.length() == 15 || idCard.length() == 18)) {
			// 區位碼校驗
			if (AREA_CODE.indexOf(idCard.substring(0, 2) + ",") != -1) {
				// 15位身份證校驗
				if (pattern_15.matcher(idCard).matches()) {
					return checkDateTime("19" + idCard.substring(6, 12));
				} else if (pattern_18.matcher(idCard).matches()) {// 18位身份證校驗
					if (checkDateTime(idCard.substring(6, 14))) {
						// 最後一位校驗位比較
						if (trasIdLastNo(idCard.substring(0, 17)).equals(idCard.substring(17))) {
							return true;
						}
					}
				}
			}
		}

		return false;
	}

	/**
	 * 身份證中字符串日期合法性校驗yyyyMMdd
	 * 
	 * @param dateTime
	 * @return
	 */
	private static boolean checkDateTime(String dateTime) {
		DateFormat df = new SimpleDateFormat("yyyyMMdd");
		try {
			df.parse(dateTime);
		} catch (ParseException e) {
			logger.error("身份證中字符串日期合法性校驗出錯", e);
			return false;
		}
		// 獲取日期詳細信息
		int year = Integer.valueOf(dateTime.substring(0, 4));
		int month = Integer.valueOf(dateTime.substring(4, 6));
		int day = Integer.valueOf(dateTime.substring(6));
		// 是否閏年
		boolean isLeapYear = false;
		if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
			isLeapYear = true;
		}
		// 判斷月份
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
			// 判斷日期
			if (day > 0 && day < 32) {
				return true;
			}
		} else if (month == 4 || month == 6 || month == 9 || month == 11) {
			// 判斷日期
			if (day > 0 && day < 31) {
				return true;
			}
		} else if (month == 2) {
			// 判斷日期
			if (isLeapYear) {
				if (day > 0 && day < 30) {
					return true;
				}
			} else {
				if (day > 0 && day < 29) {
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * 根據15位或者18位身份證號碼判斷性別,按照系統參數表cs_type='CS1006'獲取
	 * 
	 * @param idCard
	 * @return
	 */
	public static String judgeGenderByIdCard(String idCard) {
		if (StringUtils.isNotBlank(idCard)) {
			Pattern pattern = Pattern.compile("[0-9]*");
			if (idCard.length() == 15 && pattern.matcher(idCard).matches()) {
				// 身份證號碼15位,都是數字,最後一位爲奇數則爲男不然爲女
				if (Integer.valueOf(idCard.substring(idCard.length() - 1, idCard.length())) % 2 == 0) {
					return "F"; // 女
				} else {
					return "M"; // 男
				}
			} else if (idCard.length() == 18 && pattern.matcher(idCard.substring(0, idCard.length() - 1)).matches()) {
				// 身份證號碼18位,除最後一位其餘都是數字,倒數第二位爲奇數則爲男不然爲女
				if (Integer.valueOf(idCard.substring(idCard.length() - 2, idCard.length() - 1)) % 2 == 0) {
					return "F"; // 女
				} else {
					return "M"; // 男
				}
			}
		}
		return "N"; // 不肯定
	}

	/**
	 * 根據15位或者18位身份證號碼構造出生日期
	 * 
	 * @param idCard
	 * @return
	 */
	public static String constructBirthdayByIdCard(String idCard) {
		String birthday = "";
		if (StringUtils.isNotBlank(idCard)) {
			Pattern pattern = Pattern.compile("[0-9]*");
			if (idCard.length() == 15 && pattern.matcher(idCard).matches()) {
				String year = "19" + idCard.substring(6, 8);
				String month = idCard.substring(8, 10);
				String day = idCard.substring(10, 12);
				birthday = year + " " + month + "-" + day;
			} else if (idCard.length() == 18) {
				String year = idCard.substring(6, 10);
				String month = idCard.substring(10, 12);
				String day = idCard.substring(12, 14);
				birthday = year + "-" + month + "-" + day;
			}
		}
		return birthday;
	}

	/**
	 * 把15位身份證號轉換成18位身份證號碼 出生月份前加"19"(20世紀才使用的15位身份證號碼),最後一位加校驗碼
	 * 
	 * @param custNo
	 * @return
	 */
	public static String transIdFrom15To18(String custNo) {
		String idCardNo = custNo;
		if (StringUtils.isNotBlank(custNo) && custNo.trim().length() == 15) {
			custNo = custNo.trim();
			StringBuffer newIdCard = new StringBuffer(custNo);
			newIdCard.insert(6, "19");
			newIdCard.append(trasIdLastNo(newIdCard.toString()));

			idCardNo = newIdCard.toString();
		}
		return idCardNo;
	}

	/**
	 * 生成身份證最後一位效驗碼
	 * 
	 * @param id
	 * @return
	 */
	private static String trasIdLastNo(String id) {
		char pszSrc[] = id.toCharArray();
		int iS = 0;
		int iW[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
		char szVerCode[] = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
		int i;
		for (i = 0; i < id.length(); i++) {
			iS += (pszSrc[i] - '0') * iW[i];
		}
		int iY = iS % 11;
		return String.valueOf(szVerCode[iY]);
	}

	/**
	 * 把18位身份證號轉換成15位身份證號碼。但存在身份證號碼重複
	 * 
	 * @param sCustno
	 * @return
	 */
	public static String transformationIdFrom18To15(String sCustno) {
		String first7No = sCustno.substring(0, 6);
		String lastNo = sCustno.substring(8, sCustno.length() - 1);
		return first7No + lastNo;
	}

	/**
	 * 比較身份證號碼是否相等 身份證號碼長度要麼15,要麼18,其餘直接進行比較。15位與18位身份證進行比較的時候,先將15位的轉換爲18位身份證號碼
	 * 
	 * @param id1
	 * @param id2
	 * @return
	 */
	public static boolean compareIdCards(String id1, String id2) {
		if (StringUtils.isNotBlank(id1) && StringUtils.isNotBlank(id2) && (id1.length() == 15 || id1.length() == 18)
				&& (id2.length() == 15 || id2.length() == 18)) {
			if (id1.length() == id2.length()) {
				return StringUtils.equals(id1, id2);
			} else {
				if (id1.length() == 15) {
					return StringUtils.equals(IdCardUtil.transIdFrom15To18(id1), id2);
				} else {
					return StringUtils.equals(id1, IdCardUtil.transIdFrom15To18(id2));
				}
			}
		} else {
			return StringUtils.equals(id1, id2);
		}
	}
}
相關文章
相關標籤/搜索