【转】身份证号码校验与信息提取 - Java 代码

转载地址:http://www.w3china.org/blog/more.asp?name=lhwork&id=19148

import java.util.regex.*;
 
/**
  * <p> Title: 验证 18/15 位中国公民身份证号码,并分析有效的数据 </p>
  * <p> Description: </p>
  * <p> Copyright: Copyright (c) 2004 </p>
  * <p> Company: Labile </p>
  * @author not attributable
  * @version 1.0
  */
public class Verifier {
 
  private static final String verify18PatternStr = "(\\d{6})" + "(\\d{8})" + "(\\d{3})" + "([\\d[xX]]{1})" ;
  private static final Pattern verify18Pattern = Pattern.compile( verify18PatternStr );
  private static final String verify15PatternStr = "(\\d{6})" + "(\\d{6})" + "(\\d{3})" ;
  private static final Pattern verify15Pattern = Pattern.compile( verify15PatternStr );
 
 
  /**
   * 从第 18 到第 1 位的权
   */
  private static final int verify18Rights [] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
  /**
   * 检验码校对表
   */
  private static final String verify18CheckDigit [] = { "1" , "0" , "X" , "9" , "8" , "7" , "6" , "5" , "4" , "3" , "2" };
 
 
  /**
   * 地区码
   */
  private String areaNum ;
  /**
   * 出生时间
   */
  private String birthdayNum ;
  /**
   * 顺序号
   */
  private String seqNum ;
  /**
   * 校验码
   */
  private String check_digit ;
 
  private int length ;
 
  public boolean isMan() {
    int num = Integer.parseInt( seqNum );
    if (num%2==1) {
      return true ;
    }
    else
      return false ;
 }
 
  /**
   * 得到生日的日期,格式: yyyy - mm - dd
   * @return String
   */
  public String getBirthday() {
    String FullBirthdayNum = null ;
    if ( length ==15) // 在生日号码前加 “19”
      FullBirthdayNum = "19" + birthdayNum ;
    else
      FullBirthdayNum = birthdayNum ;
 
    String year = FullBirthdayNum.substring(0, 4);
    String month = FullBirthdayNum.substring(4, 6);
    String date = FullBirthdayNum.substring(6, 8);
    return year + "-" + month + "-" + date;
 }
 
  public Verifier(String IDCardNO) throws LengthIllegalException, CheckDigitInvalidException, NumberInvalidException {
    if (IDCardNO == null )
      throw new NumberInvalidException();
    length = IDCardNO.length();
    switch ( length ) {
      case 15:
        Verifier15(IDCardNO);
        break ;
      case 18:
        Verifier18(IDCardNO);
        break ;
      default :
        throw new LengthIllegalException();
    }
 
 }
 
  private void Verifier15(String IDCardNO) throws NumberInvalidException {
 
    Matcher m = verify15Pattern .matcher(IDCardNO);
    if (m.matches()== false ) {
      throw new NumberInvalidException();
    }
    areaNum = m.group(1);
    birthdayNum = m.group(2);
    seqNum = m.group(3);
 }
 
  private void Verifier18(String IDCardNO) throws CheckDigitInvalidException, NumberInvalidException {
 
    Matcher m = verify18Pattern .matcher(IDCardNO);
    if (m.matches()== false ) {
      throw new NumberInvalidException();
    }
    areaNum = m.group(1);
    birthdayNum = m.group(2);
    seqNum = m.group(3);
    check_digit = m.group(4);
 
 
    // 预期的校验位 :
    String expect_check_digit = getCheck_digit18(IDCardNO);
 
    // 如果校验位无效
    if (expect_check_digit.equalsIgnoreCase( check_digit )== false )
      throw new CheckDigitInvalidException();
 }
 
  /**
   * 18 /17 位身份证号算出校验位
   * @param IDCardNO String
   * @return String
   */
  public static String getCheck_digit18(String IDCardNO) {
    // 权总值
    int sum = 0;
    for ( int i=0; i<=16; i++) {
      int num = Integer.parseInt( IDCardNO.substring(i,i + 1) );
      int right = verify18Rights [i];
      sum = sum + num*right;
    }
    // 对权总值取模
    int y = sum % 11;
    return verify18CheckDigit [y];
 }
 
  public static String IDCardNO15To18(String IDCardNO15) throws
      NumberInvalidException {
 
    Matcher m = verify15Pattern .matcher(IDCardNO15);
    if (m.matches()== false ) {
      throw new NumberInvalidException();
    }
 
    String NO17 = IDCardNO15.substring(0,6) + "19" + IDCardNO15.substring(6,15);
    return NO17 + getCheck_digit18(NO17);
 }
 
  public String getAreaNum() {
    return areaNum ;
 }
 
  public String getBirthdayNum() {
    return birthdayNum ;
 }
 
  /**
   * 返回校验位,只有 18 位身份证可用, 15 位时返回 null
   * @return String
   */
  public String getCheck_digitNum18() {
    return check_digit ;
 }
  public int getLength() {
    return length ;
 }
  public String getSeqNum() {
    return seqNum ;
 }
 
}
 
import java.util.regex.*;
 
/**
  * <p> Title: 验证 18/15 位中国公民身份证号码,并分析有效的数据 </p>
  * <p> Description: </p>
  * <p> Copyright: Copyright (c) 2004 </p>
  * <p> Company: Labile </p>
  * @author not attributable
  * @version 1.0
  */
public class Verifier {
 
  private static final String verify18PatternStr = "(\\d{6})" + "(\\d{8})" + "(\\d{3})" + "([\\d[xX]]{1})" ;
  private static final Pattern verify18Pattern = Pattern.compile( verify18PatternStr );
  private static final String verify15PatternStr = "(\\d{6})" + "(\\d{6})" + "(\\d{3})" ;
  private static final Pattern verify15Pattern = Pattern.compile( verify15PatternStr );
 
 
  /**
   * 从第 18 到第 1 位的权
   */
  private static final int verify18Rights [] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
  /**
   * 检验码校对表
   */
  private static final String verify18CheckDigit [] = { "1" , "0" , "X" , "9" , "8" , "7" , "6" , "5" , "4" , "3" , "2" };
 
 
  /**
   * 地区码
   */
  private String areaNum ;
  /**
   * 出生时间
   */
  private String birthdayNum ;
  /**
   * 顺序号
   */
  private String seqNum ;
  /**
   * 校验码
   */
  private String check_digit ;
 
  private int length ;
 
  public boolean isMan() {
    int num = Integer.parseInt( seqNum );
    if (num%2==1) {
      return true ;
    }
    else
      return false ;
 }
 
  /**
   * 得到生日的日期,格式: yyyy - mm - dd
   * @return String
   */
  public String getBirthday() {
    String FullBirthdayNum = null ;
    if ( length ==15) // 在生日号码前加 “19”
      FullBirthdayNum = "19" + birthdayNum ;
    else
      FullBirthdayNum = birthdayNum ;
 
    String year = FullBirthdayNum.substring(0, 4);
    String month = FullBirthdayNum.substring(4, 6);
    String date = FullBirthdayNum.substring(6, 8);
    return year + "-" + month + "-" + date;
 }
 
  public Verifier(String IDCardNO) throws LengthIllegalException, CheckDigitInvalidException, NumberInvalidException {
    if (IDCardNO == null )
      throw new NumberInvalidException();
    length = IDCardNO.length();
    switch ( length ) {
      case 15:
        Verifier15(IDCardNO);
        break ;
      case 18:
        Verifier18(IDCardNO);
        break ;
      default :
        throw new LengthIllegalException();
    }
 
 }
 
  private void Verifier15(String IDCardNO) throws NumberInvalidException {
 
    Matcher m = verify15Pattern .matcher(IDCardNO);
    if (m.matches()== false ) {
      throw new NumberInvalidException();
    }
    areaNum = m.group(1);
    birthdayNum = m.group(2);
    seqNum = m.group(3);
 }
 
  private void Verifier18(String IDCardNO) throws CheckDigitInvalidException, NumberInvalidException {
 
    Matcher m = verify18Pattern .matcher(IDCardNO);
    if (m.matches()== false ) {
      throw new NumberInvalidException();
    }
    areaNum = m.group(1);
    birthdayNum = m.group(2);
    seqNum = m.group(3);
    check_digit = m.group(4);
 
 
    // 预期的校验位 :
    String expect_check_digit = getCheck_digit18(IDCardNO);
 
    // 如果校验位无效
    if (expect_check_digit.equalsIgnoreCase( check_digit )== false )
      throw new CheckDigitInvalidException();
 }
 
  /**
   * 18 /17 位身份证号算出校验位
   * @param IDCardNO String
   * @return String
   */
  public static String getCheck_digit18(String IDCardNO) {
    // 权总值
    int sum = 0;
    for ( int i=0; i<=16; i++) {
      int num = Integer.parseInt( IDCardNO.substring(i,i + 1) );
      int right = verify18Rights [i];
      sum = sum + num*right;
    }
    // 对权总值取模
    int y = sum % 11;
    return verify18CheckDigit [y];
 }
 
  public static String IDCardNO15To18(String IDCardNO15) throws
      NumberInvalidException {
 
    Matcher m = verify15Pattern .matcher(IDCardNO15);
    if (m.matches()== false ) {
      throw new NumberInvalidException();
    }
 
    String NO17 = IDCardNO15.substring(0,6) + "19" + IDCardNO15.substring(6,15);
    return NO17 + getCheck_digit18(NO17);
 }
 
  public String getAreaNum() {
    return areaNum ;
 }
 
  public String getBirthdayNum() {
    return birthdayNum ;
 }
 
  /**
   * 返回校验位,只有 18 位身份证可用, 15 位时返回 null
   * @return String
   */
  public String getCheck_digitNum18() {
    return check_digit ;
 }
  public int getLength() {
    return length ;
 }
  public String getSeqNum() {
    return seqNum ;
 }
 
}
 

转载于:https://www.cnblogs.com/csshaw/p/3535353.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值