身份证验证之简单校验

import java.util.Calendar;
import java.util.Scanner;

public class ValidateID {
   /*
     * 我国现行使用公民身份证号码有两种尊循两个国家标准,〖GB 11643-1989〗和〖GB 11643-1999〗。
     * 〖GB 11643-1989〗中规定的是15位身份证号码:排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。
     * 〖GB 11643-1999〗中规定的是18位身份证号码:公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
     * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
     * 地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
     * 出生日期码:表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
     * 顺序码:表示同一地址码所标识的区域范围内,对同年、同月、同日出生的人员编定的顺序号。
     * 顺序码的奇数分给男性,偶数分给女性。
     * 校验码:是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
     */
    
    // 记录信息
    private String info = "地区:";

    public static void main(String[] args) {
        new ValidateID().validateId();
    }

    public void validateId() {

        System.out.println("输入身份证号码:");
        Scanner sc = new Scanner(System.in);
        String id = sc.nextLine();
        // 判断是不是18位数字
        if (id.length() != 18) {
            System.out.println("输入的位数不对");
            return;
        }
        // 如果含有非数字,则直接返回退出
        try {
            Long.parseLong(id);
        } catch (Exception e) {
            System.out.println("输入非数字");
            return;
        }

        // 身份证代表省份的数字
        int shengfen = Integer.parseInt(id.substring(0, 2));
        
        //判断是否有该省份,有则获得相应信息
        if(!isArea(shengfen)){
            System.out.println("省份不对");
            return;
        }

        // 获得身份证年份
        int nianfen = Integer.parseInt(id.substring(6, 10));
        info += "出生日期:" + nianfen + "年";
        // 获得日期实例
        Calendar rightNow = Calendar.getInstance();
        // 获得当前年份
        int MaxYear = rightNow.get(Calendar.YEAR);
        if ((nianfen < 1949) && (nianfen > MaxYear)) {
            System.out.println("年份不对");
            return;
        }
        // 获得身份证月份
        int yuefen = Integer.parseInt(id.substring(10, 12));
        info += yuefen + "月";
        // 判断月份是否正确
        if ((yuefen <= 0) && (yuefen > 12)) {
            System.out.println("月份错误");
            return;
        }
        // 获得身份证日期
        int riqi = Integer.parseInt(id.substring(12, 14));
        info += riqi + "日";
        // 判断日期是否正确
        if (riqi <= 0 && riqi > 31) {
            System.out.println("日期错误");
            return;
        }
        // 获得身份证性别数字
        int sex = Integer.parseInt(id.substring(16, 17));
        // 奇数为男,偶数为女
        if (sex % 2 == 0) {
            info += "   性别:女";
        } else {
            info += "   性别:男";
        }
      
        System.out.println("该身份证通过验证");
        // 打印身份证信息
        System.out.println("信息如下");
        System.out.println(info);
    }
    
    //判断该省份,并获得省份信息
    public boolean isArea(int shengfen){
        // 判断该省份是否存在,其中下列代码代表不同省份,可到网上查找获得
        if (!((shengfen == 11) || (shengfen == 12) || (shengfen == 13)
                || (shengfen == 14) || (shengfen == 15) || (shengfen == 21)
                || (shengfen == 22) || (shengfen == 23) || (shengfen == 31)
                || (shengfen == 32) || (shengfen == 33) || (shengfen == 34)
                || (shengfen == 35) || (shengfen == 36) || (shengfen == 37)
                || (shengfen == 41) || (shengfen == 42) || (shengfen == 43)
                || (shengfen == 44) || (shengfen == 45) || (shengfen == 46)
                || (shengfen == 50) || (shengfen == 51) || (shengfen == 52)
                || (shengfen == 53) || (shengfen == 54) || (shengfen == 61)
                || (shengfen == 62) || (shengfen == 63) || (shengfen == 64)
                || (shengfen == 65) || (shengfen == 71) || (shengfen == 81) || (shengfen == 82))) {
            System.out.println("省份不对");
            return false;
        }
        
        if (shengfen == 11) {
            info += "北京    ";
        }
        if (shengfen == 12) {
            info += "天津    ";
        }
        if (shengfen == 13) {
            info += "河北    ";
        }
        if (shengfen == 14) {
            info += "山西    ";
        }
        if (shengfen == 15) {
            info += "内蒙古    ";
        }
        if (shengfen == 21) {
            info += "辽宁    ";
        }
        if (shengfen == 22) {
            info += "吉林    ";
        }
        if (shengfen == 23) {
            info += "黑龙江    ";
        }
        if (shengfen == 31) {
            info += "上海    ";
        }
        if (shengfen == 32) {
            info += "江苏    ";
        }
        if (shengfen == 33) {
            info += "浙江    ";
        }
        if (shengfen == 34) {
            info += "安徽    ";
        }
        if (shengfen == 35) {
            info += "福建    ";
        }
        if (shengfen == 36) {
            info += "江西    ";
        }
        if (shengfen == 37) {
            info += "山东    ";
        }
        if (shengfen == 41) {
            info += "河南    ";
        }
        if (shengfen == 42) {
            info += "湖北    ";
        }
        if (shengfen == 43) {
            info += "湖南    ";
        }
        if (shengfen == 44) {
            info += "广东    ";
        }
        if (shengfen == 45) {
            info += "广西壮族自治区    ";
        }
        if (shengfen == 46) {
            info += "海南    ";
        }
        if (shengfen == 50) {
            info += "重庆    ";
        }
        if (shengfen == 51) {
            info += "四川    ";
        }
        if (shengfen == 52) {
            info += "贵州    ";
        }
        if (shengfen == 53) {
            info += "云南    ";
        }
        if (shengfen == 54) {
            info += "西藏自治区    ";
        }
        if (shengfen == 61) {
            info += "陕西    ";
        }
        if (shengfen == 62) {
            info += "甘肃    ";
        }
        if (shengfen == 63) {
            info += "青海    ";
        }
        if (shengfen == 64) {
            info += "宁夏回族自治区    ";
        }
        if (shengfen == 65) {
            info += "新疆维吾尔族自治区    ";
        }
        if (shengfen == 71) {
            info += "台湾    ";
        }
        if (shengfen == 81) {
            info += "香港特别行政区    ";
        }
        if (shengfen == 82) {
            info += "澳门特别行政区    ";
        }
        return true;
    }

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值