第五章 Java常用类作业之验证身份证号码是否正确(带校验算法)


 

 

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");
		}
	}
}

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM