新旧身份证合法性验证及相互转换算法(三):Java身份证号码验证及将15位转换18位

转载 2014年06月27日 11:38:13
package test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 身份证号码验证
 * 
 */
public class IdentificationCodeUtil {

	public static final int IDENTITYCODE_OLD = 15; // 老身份证15位
	public static final int IDENTITYCODE_NEW = 18; // 新身份证18位
	public static int[] Wi = new int[17];

	/**
	 * 判断身份证号码是否正确。
	 * 
	 * @param code
	 *            身份证号码。
	 * @return 如果身份证号码正确,则返回true,否则返回false。
	 */
	public static boolean isIdentityCode(String code) {

		if (StringUtil.empty(code)) {
			return false;
		}

		String birthDay = "";
		code = code.trim();

		// 长度只有15和18两种情况
		if ((code.length() != IDENTITYCODE_OLD)
				&& (code.length() != IDENTITYCODE_NEW)) {
			return false;
		}

		// 身份证号码必须为数字(18位的新身份证最后一位可以是x)
		Pattern pt = Pattern.compile("\\d{15,17}([\\dxX]{1})?");
		Matcher mt = pt.matcher(code);
		if (!mt.find()) {
			return false;
		}

		// 验证生日
		if (code.length() == IDENTITYCODE_OLD) {
			birthDay = "19" + code.substring(6, 12);
		} else {
			birthDay = code.substring(6, 14);
		}
		if (!TimeUtil.isRightDate(birthDay, "yyyyMMdd")) {
			return false;
		}

		// 最后一位校验码验证
		if (code.length() == IDENTITYCODE_NEW) {
			String lastNum = getCheckFlag(code.substring(0,
					IDENTITYCODE_NEW - 1));
			// check last digit
			if (!("" + code.charAt(IDENTITYCODE_NEW - 1)).toUpperCase().equals(
					lastNum)) {
				return false;
			}
		}

		return true;
	}

	/**
	 * 获取新身份证的最后一位:检验位
	 * 
	 * @param code
	 *            18位身份证的前17位
	 * @return 新身份证的最后一位
	 */
	private static String getCheckFlag(String code) {

		int[] varArray = new int[code.length()];
		String lastNum = "";
		int numSum = 0;
		// 初始化位权值
		setWiBuffer();
		for (int i = 0; i < code.length(); i++) {
			varArray[i] = NumberUtil.toInt("" + code.charAt(i));
			varArray[i] = varArray[i] * Wi[i];
			numSum = numSum + varArray[i];
		}
		int checkDigit = 12 - numSum % 11;
		switch (checkDigit) {
		case 10:
			lastNum = "X";
			break;
		case 11:
			lastNum = "0";
			break;
		case 12:
			lastNum = "1";
			break;
		default:
			lastNum = String.valueOf(checkDigit);
		}
		return lastNum;
	}

	/**
	 * 初始化位权值
	 */
	private static void setWiBuffer() {
		for (int i = 0; i < Wi.length; i++) {
			int k = (int) Math.pow(2, (Wi.length - i));
			Wi[i] = k % 11;
		}
	}

	/**
	 * 判别是否字符串为null或者没有内容,或者全部为空格。
	 */
	public static boolean empty(String o) {
		return ((null == o) || (o.length() <= 0) || (o.trim().equals("")));
	}

	/**
	 * 将15位身份证号码升级为18位身份证号码
	 * 
	 * @param code
	 *            15位身份证号码
	 * @return 18位身份证号码
	 */
	public static String update2eighteen(String code) {

		if (StringUtil.empty(code)) {
			return "";
		}

		code = code.trim();

		if (code.length() != IDENTITYCODE_OLD || !isIdentityCode(code)) {
			return "";
		}

		code = code.substring(0, 6) + "19" + code.substring(6);
		//
		code = code + getCheckFlag(code);

		return code;
	}
	
	public static void main(String[] args){
		String[] codeArray = new String[]{"330521197411044030","53010119810602007x","53010119810602001x"};
		for(int i= 0;i<codeArray.length;i++){
			if(isIdentityCode(codeArray[i])){
				System.out.println(codeArray[i]+":为正确的身份证号码!");
			}else{
				System.out.println(codeArray[i]+":为错误的身份证号码!");
			}	
		}
		
		System.out.println("转换后的身份证号码为:"+update2eighteen("330521820721052"));;

	}
}

Java身份证号码验证及将15位转换18位

package test; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 身份证号码验证...
  • friendxuan
  • friendxuan
  • 2010年12月19日 21:29
  • 2168

身份证检验算法,以及15位和18位身份证的相互转换!

package cn.ccb.boup.util.common; import java.util.regex.*; /**  * 身份证检验算法,以及15位和18位身份证的相互转换。  * ...
  • myid
  • myid
  • 2012年04月24日 17:18
  • 2708

java 校验15位或18位身份证号码

package com.first.common.utility.idcard; import java.text.SimpleDateFormat; import java.util.C...
  • yuanquanl
  • yuanquanl
  • 2016年09月01日 17:26
  • 1939

简单的关于身份证(15位或者18位)合法性验证

简单的关于身份证(15位或者18位)合法性验证
  • caolipeng_918
  • caolipeng_918
  • 2015年01月09日 15:51
  • 1641

Java 将15位身份证号转化为18位返回,非15位身份证号原值返回

/*  身份证号码的结构和表示形式  1、号码的结构     公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺...
  • chenzpandy
  • chenzpandy
  • 2016年04月19日 16:59
  • 378

15位和18位身份证的正则表达式及其验证

1、简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card) (2)preg_match("/^(\d{6...
  • ch469299503
  • ch469299503
  • 2013年09月05日 10:10
  • 1869

php 验证 身份证号码 合法性 兼容 (15位 和 18位身份证号码)

  • mhhyoucom
  • mhhyoucom
  • 2014年03月28日 11:41
  • 1633

身份证15位升18位的算法

  现在新的身份证已经从15位升到了18位了,很多软件都可能用到身份证的输入、校验的工作,关于新身份证的编码似乎文章很少,我在2000年的时候找到了计算机世界的一篇文章,发现现在的身份证校验码居然可能...
  • pazee
  • pazee
  • 2002年08月13日 09:12
  • 5556

15位身份证转18位批量转换工具及其算法(VB版)

15位身份证转18位批量转换工具及其算法                        *************************************************...
  • zccpt
  • zccpt
  • 2012年10月05日 20:00
  • 2673

DB2 验证身份证的存储过程

 CREATE FUNCTION  sfzyz(inum varchar(18))    RETURNS varchar(18)------------------------------------...
  • chengjianqiang
  • chengjianqiang
  • 2009年10月12日 22:29
  • 626
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:新旧身份证合法性验证及相互转换算法(三):Java身份证号码验证及将15位转换18位
举报原因:
原因补充:

(最多只允许输入30个字)