![]()
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 验证身份证号码是否合法
*
* @author xhh 认为代码还能简化
*/
public class Main{
// 判断前17位数是否为数字
public static boolean isNum(String ex) {
if (ex.matches("\\d+")) {
return true;
} else {
return false;
}
}
// 判断最后一位数是否为数字或小写字母
public static boolean isNumOrLower(char last) {
if (Character.isDigit(last) || (last >= 'a' && last <= 'z')) {
return true;
} else {
return false;
}
}
// 判断日期是否合法
public static boolean isLegal(String birth) {
// 准备模板,从字符串中提取出日期数字
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
try {
format.setLenient(false);
format.parse(birth);
return true;
} catch (Exception e) {
return false;
}
}
// 校验码检查最后一位
public static boolean checkLast(String ex, char last) {
// 将前面的身份证号码17位数分别乘以不同的系数
// 从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
// 将系数存入int数组中,不可修改
final int[] coeffcients = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
// 将17位数转化为char数组,再转换成int数组
char[] cArray = ex.toCharArray();
int[] iArray = new int[cArray.length];
int sum = 0; // 将这17位数字和系数相乘的结果相加
int remain = 0; // 用加出来和除以11,取余
// 注意:数字多就不适合使用这种方法
for (int i = 0; i < iArray.length; i++) {
iArray[i] = Integer.parseInt(String.valueOf(cArray[i]));
sum += iArray[i] * coeffcients[i];
}
remain = sum % 11;
// 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字
// 其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。
final String[] s = { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" };
// 判断是否和输入的身份证尾数相同
if (s[remain].equals(String.valueOf(last))) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
// 输入18位身份证
Scanner in = new Scanner(System.in);
String id = null;
// 判断是否输入
if (in.hasNext()) {
id = in.next();
}
// 判断是否18位
if (id.length() == 18) {
// 获取前17位数
String exString = id.substring(0, 17);
// 获取最后一位数
char lastChar = id.charAt(17);
// 获取生日
String birth = id.substring(6, 14);
// 判断身份证是否合法
if (isNum(exString) && isNumOrLower(lastChar) && isLegal(birth) && checkLast(exString, lastChar)) {
// 准备模板,从字符串中提取出日期数字
SimpleDateFormat format1 = new SimpleDateFormat("yyyyMMdd");
// 准备模板,将提取后的日期数字变为指定的格式
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format1.parse(birth);
System.out.println(format2.format(date)); // 输出有效日期
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("0000-00-00");
}
} else {
System.out.println("0000-00-00");
}
}
}