尘缘丶 发表于 2017-11-15 00:18

【Java】编写身份证号码校验工具

本帖最后由 wushaominkk 于 2018-4-27 17:47 编辑

很久之前楼主闲的无聊做Java校验身份证,其实算法我也找了,最开始根本不理解,后来慢慢接受的,所以当时刚理解就开始做
算法层次还是停留在加减法,希望大家不要介意,下面给大家介绍一下写的这些东西


private String num = null;//声明的身份证号码
   
    public Jiao() {//无参构造方法
      super();
    }

    public Jiao(String num) {//有参构造方法
      super();
      this.num = num;
      JiaoYan(num);
    }

    public void JiaoYan(String fhz){//校验方法
      if(num.length()==18){
            int qq = 0;//截取字符的起点
            String year = num.substring(qq+6, qq+10);//截取年
            String yue = num.substring(qq+10, qq+12);//截取月
            int y=Integer.parseInt(yue);
            String ri = num.substring(qq+12, qq+14);//截取日
            int r=Integer.parseInt(ri);
            int nyr=Integer.parseInt(year+yue+ri);
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//设置日期格式
            int rq=Integer.parseInt(df.format(new Date()));
            System.out.println(rq);// new Date()为获取当前系统时间
            int iW[]={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
            int sum=0;
            int sum1=0;
            int pd;
            if(nyr<rq&&nyr>19000000){
                if((y>00&&y<=12)&&(r>00&&r<=31)){
                  System.out.println(year+"年"+yue+"月"+ri+"日");
                  String sz [] = new String ;
                  int zx[]=new int ;
                  for(int i=0;i<sz.length;i++){
                        String sr =num.substring(i, i+1);
                        sz=sr;
                        zx=Integer.parseInt(sz);
                        sum=iW*zx;
                        sum1=sum+sum1;
                        
                  }
                  pd=sum1%11;
                  String zh=num.substring(17);
                  switch(pd){
                  case 0:
                        if(zh.equals("1")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 1:
                        if(zh.equals("0")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 2:
                        if(zh.equals("X")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 3:
                        if(zh.equals("9")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 4:
                        if(zh.equals("8")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 5:
                        if(zh.equals("7")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 6:
                        if(zh.equals("6")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 7:
                        if(zh.equals("5")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 8:
                        if(zh.equals("4")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 9:
                        if(zh.equals("3")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  case 10:
                        if(zh.equals("2")){
                            System.out.println("验证成功");
                            fhz=num;
                        }else{
                            System.out.println("验证失败");
                        }
                        break;
                  }
                }else{
                  System.out.println("出生日期错误");
                  fhz="出生日期错误";
                }
            }else{
                System.out.println("出生年月日错误");//年月日错误,结束
                fhz="出生年月日错误";
            }
      }else{
            System.out.println("输入错误,长度不对");
            fhz="输入错误,长度不对";
      }
    }


下面就是测试类,创建对象的时候调用的无参构造器,记得导包哦
System.out.println("请输入自己的身份证号码");
      Scanner in=new Scanner(System.in);
      Jiao j=new Jiao(in.next());


测试图在下方,身份证号码网上随便搜的一个,有一些大家用不到,但是为了证明一下,所以打印出来了






公子语凉 发表于 2018-4-27 22:46

package 身份证验证小程序;

import java.util.Scanner;

public class Test
{
        public static void main(String[] args)
        {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入18位身份证:");
                while(true)
                {
                        String str = sc.nextLine();
                        char[] arr =str.toCharArray();
                        if(panduan(arr))
                        {
                                System.out.println("输入正确!");
                                break ;
                        }
                        System.out.println("输入错误,请重新输入:");
                }
        }
        public static boolean panduan(char[] arr)
        {
                int weight[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
                char map[] = {'1','0','X','9','8','7','6','5','4','3','2'};
                int sum = 0 ;
                for(int i = 0 ; i < 17 ; i++)
                {
                        sum += (arr-'0') * weight;
                }
                int i = sum%11 ;
                char c = arr;
                if(map == c)
                {
                        return true ;
                }
                return false ;
        }
}

       















尘缘丶 发表于 2017-11-23 00:39

anttu 发表于 2017-11-22 20:07
身份证号校验无法用正则,六位数字地址码+八位数字出生日期码+三位数字顺序码+一位数字校验码,正则做不到

身份证号规则,前六位(省市县各2位),中间八位出生年月日(8位),后边两位是登记户籍时派出所的编号(当地的编号,可能是乡镇级),倒数第二位性别(男单。女双),最后一位校验码(通过这个公式算出来的校验码)。。。
但,计算做出来了,这个身份证号码是否存在那就不得而知了,所以只能用作校验身份证号码,不能判断实名制真实性

萋小磊 发表于 2017-11-15 00:50

我记得这个昨天谁发过

FZJ94 发表于 2017-11-15 01:05

谢谢分享 那些零碎的回忆,渐渐失去了方向。

sayysl 发表于 2017-11-15 03:58

可以,老铁辛苦了。可以注册一些网站使用XX

wang65424773 发表于 2017-11-15 06:52

挺好,谢谢分享

zlq6891 发表于 2017-11-15 08:01

学习一下,最近在学JAVA

xxp123 发表于 2017-11-15 08:05

准备学这个的,等考研结束

vwisdom 发表于 2017-11-15 08:13

支持一下,我也是编程新手

Yan亮 发表于 2017-11-15 08:16

查询准确吗,

巨无霸 发表于 2017-11-15 08:28

这个很适合新手练习用,粗略的看了一眼,这个应该涉及到了字符串的分割、switch语句、if判断等等!
页: [1] 2 3 4
查看完整版本: 【Java】编写身份证号码校验工具