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

来源:互联网 发布:win7建立网络连接 编辑:程序博客网 时间:2024/05/29 11:07

package cn.ccb.boup.util.common;

import java.util.regex.*;

/**
 * 身份证检验算法,以及15位和18位身份证的相互转换。
 *
 * @author guojg
 */
public class IdCardUtil {

 public IdCardUtil() {

 }

 /**
  * 15位身份证号码转化为18位的身份证。如果是18位的身份证则直接返回,不作任何变化。
  *
  * @param idCard,15位的有效身份证号码
  * @return idCard18 返回18位的有效身份证
  */
 public String IdCard15to18(String idCard) {
  idCard = idCard.trim();
  StringBuffer idCard18 = new StringBuffer(idCard);
  // 加权因子
  // int[] weight = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
  // 校验码值
  char[] checkBit = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3',
    '2' };
  int sum = 0;
  // 15位的身份证
  if (idCard != null && idCard.length() == 15) {
   idCard18.insert(6, "19");
   for (int index = 0; index < idCard18.length(); index++) {
    char c = idCard18.charAt(index);
    int ai = Integer.parseInt(new Character(c).toString());
    // sum = sum+ai*weight[index];
    // 加权因子的算法
    int Wi = ((int) Math.pow(2, idCard18.length() - index)) % 11;
    sum = sum + ai * Wi;
   }
   int indexOfCheckBit = sum % 11; // 取模
   idCard18.append(checkBit[indexOfCheckBit]);
  }

  return idCard18.toString();
 }

 /**
  * 转化18位身份证位15位身份证。如果输入的是15位的身份证则不做任何转化,直接返回。
  *
  * @param idCard
  *            18位身份证号码
  * @return idCard15
  */
 public String IdCard18to15(String idCard) {
  idCard = idCard.trim();
  StringBuffer idCard15 = new StringBuffer(idCard);
  if (idCard != null && idCard.length() == 18) {
   idCard15.delete(17, 18);
   idCard15.delete(6, 8);
  }
  return idCard15.toString();

 }

 /**
  * 校验是否是一个有效的身份证。如果是18的身份证,则校验18位的身份证。15位的身份证不校验,也无法校验
  *
  * @param idCart
  * @return
  */
 public boolean checkIDCard(String idCard) {
  boolean isIDCard = false;
  Pattern pattern = Pattern.compile("\\d{15}|\\d{17}[x,X,0-9]");
  Matcher matcher = pattern.matcher(idCard);
  if (matcher.matches()) {// 可能是一个身份证
   isIDCard = true;
   if (idCard.length() == 18) {// 如果是18的身份证,则校验18位的身份证。15位的身份证暂不校验
    String IdCard15 = IdCard18to15(idCard);
    String IdCard18 = IdCard15to18(IdCard15);
    if (!idCard.equals(IdCard18)) {
     isIDCard = false;
    }
   } else if (idCard.length() == 15) {
    isIDCard = true;
   } else {
    isIDCard = false;
   }
  }

  return isIDCard;
 }

 public static void main(String[] args) {
  IdCardUtil u = new IdCardUtil();
  String idCard = "420106810304041";
  System.out.println(u.IdCard15to18(idCard));
  // u.IdCard15to18(idCard);
  // u.IdCard18to15(idCard);
  // boolean flag = u.checkIDCard(idCard);
 }

}

原创粉丝点击