java实现验证身份证号是否合法

输入18位的身份证号码,要求首先验证身份证号码合法性(仅利用校验位验证),如果合法则输出性别和出生日期。说明:
(1)身份证号码的7~12位表示出生年月;第17位表示性别,奇数为男,偶数为女;最后一位为校验位
(2)校验算法:将前面的身份证号码17位数加权求和(系数分别7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2),然后除以11,根据余数找到对应的校验位(分别为1、0、X 、9、8、7、6、5、4、3、2),如果计算的校验位和输入的校验位一致说明身份证号码合法。比如身份证号码53010219200508011x,前17位加权求和:
(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2=189
189%11 = 2
序号为2的校验位就是X,所以身份证号码合法。

package zt_text_id;
import java.util.Scanner;

public class zt_text_idmain {
    public static void main(String[] args) {
        System.out.println("请输入你的身份证号:");
        Scanner scan = new Scanner(System.in);
        String iden = scan.next();
        idCard id = new idCard(iden);
        System.out.println("你的身份证号"+(id.isLegal()==1?"合法":"不合法"));
        if (id.isLegal()==1){
            System.out.println("你的出生年月是:"+id.year());
            System.out.println("性别:"+(id.sex()==1?"男":"女"));
        }
    }
}
package zt_text_id;

public class idCard {
    private String id;
    private static final byte MALE = 1;
    private static final byte FAMALE = 0;
    /**
     * 构造函数初始化
     * @param id
     */
    public idCard(String id){
        this.id = id;
    }

    /**
     * 检验身份证是否合法
     * @return 1-合法;0-不合法
     */
    public int isLegal(){
        int a = 0;
        int sum = 0;
        char checkBit[]={'1','0','X','9','8','7','6','5','4','3','2'};
        int []add={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        char []stringArr = id.toCharArray();
        for (int i=0;i<17;i++){
            sum +=add[i]*(stringArr[i]-'0');
        }
        if (stringArr[17]==checkBit[sum%11]){
            a=1;
        }
        return a;
    }

    /**
     * 判断性别
     * @return 1-男;0-女;-1-错误;
     */
    public byte sex(){

        if (isLegal()==1){
            char []stringArr = id.toCharArray();
            if (stringArr[16]%2==0){
                return FAMALE;
            }else{
            	return MALE;
              
            }
        }
        return -1;
    }

    /**
     * 输出年月日
     * @return 年月日的字符串比如:20171207
     */
    public String year(){
        String num=null;
        if (isLegal()==1){
            num = id.substring(6,14);
        }
        return num;
    }
}

总结:编程主要的还是思路,思路清晰了写代码就容易,就比如本题,我们拿到的时候首先想输入一个身份证号,然后就要判断身份证号是否合法,等合法了我们才可以进行下一步。这样的话我们就需要一个判断身份证号是否合法的方法。当判断合法之后,我们就可以输出年月和性别了。输出年月和性别可以分别设置方法进行判断。
当然这里面存在一些bug,比如输入19个的身份证号,前18位正确,多数了一个数也会被认为正确的。

你可能感兴趣的:(Java基础练习)