java实现的18位身份证格式验证算法

公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
    1、地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

  2、出生日期码表示编码对象出生的年、月、日,按GB/T7408的规定执行。年、月、日代码之间不用分隔符。例:某人出生日期为1966年10月26日,其出生日期码为19661026。

  3、顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数千分配给女性。

  4、校验码采用ISO7064:1983,MOD11-2校验码系统。

  1)十七位数字本体码加权求和公式 S=Sum(Ai*Wi),i=0,...,16,先对前17位数字的权求和 Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi:7910584216379105842

  2)计算模 Y=mod(S,11)

  3)通过模得到对应的校验码 :012345678910 验码:10X98765432

  下面是java实现的代码

  /** IDCard.java Created on 2004-11-517:03:37 **/
   
    package org.yz21.study.idcard;

   /**
     *@author violin 2004-11-517:03:37
     *Copyright www.yz21.org2003-2004
    */
    public class IDCard{
 //wi=2(n-1)(mod11)
 final int[] wi = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};

   //verify digit
    final int[] vi = {1,0,X,9,8,7,6,5,4,3,2};

   private int[]ai = new int[18];

   public IDCard(){}

   //verify
 public boolean Verify(String idcard){
     if(idcard.length()==15){
  idcard = uptoeighteen(idcard);
     }
     if(idcard.length()!=18){
  return false;
     }
      String verify = idcard.substring(17,18);
     if(verify.equals(getVerify(idcard))){
  returntrue;
     }
     returnfalse;
 }

   //get verify
  public String getVerify(String eightcardid){
     int remaining=0;

   if(eightcardid.length()==18){
  eightcardid=eightcardid.substring(0,17);
     }

   if(eightcardid.length()==17){
  intsum=0;
  for(inti=0;i<17;i++){
      String k = eightcardid.substring(i,i+1);
      ai=Integer.parseInt(k);
  }

    for(inti=0;i<17;i++){
      sum = sum+wi*ai;
  }
         remaining=sum%11;
     }
     return remaining==2?"X":String.valueOf(vi[remaining]);
 }

 //15 update to 18
 public String uptoeighteen(String fifteencardid){
     String eightcardid = fifteencardid.substring(0,6);
     eightcardid = eightcardid + "19";
     eightcardid = eightcardid + fifteencardid.substring(6,15);
     eightcardid = eightcardid + getVerify(eightcardid);
     return eightcardid;
 }

  }

  测试代码:使用的单元测试工具是junit

  /** IDCardTest.java Created on 2004-11-517:32:12 **/
   
    package org.yz21.study.idcard;

  import junit.framework.Test;
    import junit.framework.TestCase;
    import junit.framework.TestSuite;

  /**
     *@author violin 2004-11-517:32:12
     *Copyright www.yz21.org2003-2004
    */
    public class IDCardTest extends TestCase{

   private String idcard1 = "11010519491231002X";
    private String idcard2 = "440524188001010014";
   
    public void testVerify(){
            IDCardidcard = newIDCard();
     this.assertTrue(idcard.Verify(idcard1));
     this.assertTrue(idcard.Verify(idcard2));
        }

 public static Testsuite(){
     return new TestSuite(IDCardTest.class);
        }

      public static void main(String[] args){
     junit.textui.TestRunner.run(suite());
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值