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 版权协议,转载请附上原文出处链接和本声明。