Java编写程序判断身份证是否合法

  • Post author:
  • Post category:java




Java编写程序判断身份证是否合法



需求

我国的居民身份证号码,由十七位数字本体码和一位数字校验码组成。定义方法判断用户输入的身份证号码是否合法,并在主方法中调用方法测试结果。规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。



设计思路

使用键盘录入一个身份证号字符串,定义一个方法接收。查看String类的相关API,遍历该字符串进行判断。



代码实现

package com.itheima.APITest.Test06;

import java.util.Scanner;

/*
    我国的居民身份证号码,由由十七位数字本体码和一位数字校验码组成。
    请定义方法判断用户输入的身份证号码是否合法,
    并在主方法中调用方法测试结果。
    规则为:号码为18位,不能以数字0开头,
    前17位只可以是数字,
    最后一位可以是数字或者大写字母X。
 */
public class Demo {
    public static void main(String[] args) {
        //创建Scanne对象,接收键盘录入
        //public final class Scanner
        //一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
        //public final class System
        //System类包含几个有用的类字段和方法。 它不能被实例化。
        //public static final InputStream in
        //“标准”输入流。 该流已经打开,准备提供输入数据。 通常,该流对应于键盘输入或由主机环境或用户指定的另一个输入源。
        Scanner sc = new Scanner(System.in);
        //public static final PrintStream out
        //“标准”输出流。 此流已经打开并准备好接受输出数据。 通常,此流对应于显示输出或由主机环境或用户指定的另一个输出目标。
        //public class PrintStream
        // PrintStream将功能添加到另一个输出流,即能够方便地打印各种数据值的表示。 还提供了另外两个功能。
        //public void println​()
        //通过写入行分隔符字符串来终止当前行。 行分隔符字符串由系统属性line.separator定义,并不一定是单个换行符( '\n' )。
        System.out.println("请输入一个身份证号:");
        //接收键盘录入的字符串
        //public String nextLine​()
        //将此扫描仪推进到当前行并返回跳过的输入。 此方法返回当前行的其余部分,不包括末尾的任何行分隔符。 该位置设置为下一行的开头。
        String id = sc.nextLine();
        //调用判断身份证号码的方法
        boolean b = judgeIDNumber(id);
        //输出结果
        System.out.println(b);
    }

    public static boolean judgeIDNumber(String s) {
        //判断长度不是18,直接返回false
        //public int length​()
        //返回此字符串的长度。 长度等于字符串中的数字Unicode code units 。
        if (s.length() != 18) {
            return false;
        } else {
            //判断开头数字为0,直接false
            //public char charAt​(int index)
            //返回指定索引处的char值。 指数范围从0到length() - 1 。 序列的第一个char值是索引0 ,下一个索引为1 ,依此类推,就像数组索引一样。
            if (s.charAt(0) == '0') {
                return false;
            }
            //遍历字符串
            for (int i = 0; i < s.length(); i++) {
                //17位以内
                if (i <= 16) {
                    //如果字符在数字之外直接false
                    if (s.charAt(i) < '0' || s.charAt(i) > '9') {
                        return false;
                    }
                } else {
                    //第十七位如果不是数字或者大写字母X返回false
                    if (s.charAt(i) < '0' || s.charAt(i) > '9') {
                        if (s.charAt(i) != 'X') {
                            return false;
                        }
                    }
                }
            }
        }
        //以上条件都不满足时返回true,是合法的身份证号
        return true;
    }
}



代码实现2

为了程序的健壮性,我们需要对传递的参数是否为空参进行判断,判断字符串的开头是否为数字0,我们有相应的API,基于以上,对程序进行二次优化。

package com.itheima.APITest.Test06;

import java.util.Scanner;

/*
    为了程序的健壮性,对空参进行判断。
    判断字符串的开头有相应的方法,对程序结构进行优化。
 */
public class Demo02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个身份证号:");
        String id = sc.nextLine();
        System.out.println(checkID(id));
    }

    public static boolean checkID(String s) {
        //空参判断,保证程序健壮性
        if (s == null) {
            return false;
        }
        //判断长度
        if (s.length() != 18) {
            return false;
        }
        //public boolean startsWith​(String prefix)
        //测试此字符串是否以指定的前缀开头。
        if (s.startsWith("0")) {
            return false;
        }
        //遍历字符串
        for (int i = 0; i < s.length(); i++) {
            //获取遍历字符
            char ch = s.charAt(i);
            //最后一位的校验
            if (i == s.length() - 1) {
                //优化程序,改变逻辑判断
                if (ch < '0' || ch > '9' && ch != 'X') {
                    return false;
                }
            } else {//其他位的校验
                if (ch < '0' || ch > '9') {
                    return false;
                }
            }
        }
        //以上都不符合,返回true
        return true;
    }
}



效果展示

在这里插入图片描述



版权声明:本文为l_0_f_16原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。