53010219200508011x
身份证号:53010219200508011x
所属地区:云南省
出生日期:1920年5月8日
性别:男性
校验位:正确。
------------------------------------------
请输入要查询的身份证号码,输入exit退出:
530102192005080111
身份证号:530102192005080111
所属地区:云南省
出生日期:1920年5月8日
性别:男性
校验位:错误,校验为应该是:x
------------------------------------------
请输入要查询的身份证号码,输入exit退出:
package identity_card; import java.util.HashMap; import java.util.Map; import java.util.Scanner; /** * 验证身份证 */ public class Go { /** 保存全国各地区身份证省份代码 */ private Mapcity = new HashMap (); /** 主函数,不多说 */ public static void main(String[] args) { new Go().init(); } /** 初始化相关参数及数据 */ public void init() { insert(); input(); } /** 接收输入,判定结果 */ public void input() { Scanner sc = new Scanner(System.in); while (true) { System.out.println("请输入要查询的身份证号码,输入exit退出:"); String str = sc.nextLine();// 接收一行输入 if (str.toString().equals("exit")) {// 判断是否输入的是"exit",如果不是,继续执行,否则退出 System.out.println("系统已经退出。"); System.exit(0);// 退出 } if (str.length() == 18) {// 身份证必须等于18位才可以判断,否则不判断,这里面判断等于18位的 boolean status = true;// 设初始状态为可行的 for (int i = 0; i < str.length() - 1; i++) {// 这里面只判断前17位是否是数字,因为最后一位可以是"x"或"X" if (!Character.isDigit(str.charAt(i))) {// 如果当前字节不是数字,打印提示,改变status的值 System.out.println("你输入的内容不符合要求。"); status = false; } } /* * 上面的循环走完了,如果没有出错,status还是等于true,所以这里我们再判断最后一位 * 如果上面出错了,status不等于true,那么下面的if就不执行了 */ if (status) {// 这个地方也可以写成if (status==true){ /* * 前17位判断完成后,接下来,我们判定最后一位,最后一位只能是"x"或"X" */ if (Character.isDigit(str.charAt(17)) || str.charAt(17) == 'x' || str.charAt(17) == 'X') {// 如果满足继续执行,否则执行else /** 能跑到这里面,说明前面的判断都没有问题,现在开始拆分内容了 */ {// 这一组括号其实是没有用的,在这是为了区分模块,这个模块是显示输入的内容的 System.out.print("身份证号:"); System.out.println(str); } {// 这个模块是用来显示地区的 String home = city.get(new Integer(str.substring(0, 2)));// 查询所属城市,如果查不到为null System.out.print("所属地区:"); if (home != null) System.out.println(home); else System.out.println("不存在"); } {// 这个模块是用来显示出生日期的 int year = Integer.valueOf(str.substring(6, 10)); int month = Integer.valueOf(str.substring(10, 12)); int day = Integer.valueOf(str.substring(12, 14)); System.out.print("出生日期:"); if (year > 0) {// 年份必须是大于0的 if (month > 0 && month <= 12) {// 月必须大于0,月小于13,日还要单独算 if (day > 0) {// 这里只判定大于0,小于多少,单独判定,因为年份月份不同,天数不同 int days = getDays(year, month);// 判断当前年份下,当前月下有多少天,区分平闰年 if (day <= days) { System.out.print(year + "年"); System.out.print(month + "月"); System.out.println(day + "日"); } else { System.out.println("不存在,具体几日有问题。"); } } else { System.out.println("不存在,具体几日有问题。"); } } else { System.out.println("不存在,具体几月有问题。"); } } else { System.out.println("不存在,具体哪一年有问题。"); } } {// 这个模块是用来显示性别的 System.out.print("性别:"); System.out.println((Integer.valueOf(str.substring( 16, 17))) % 2 == 1 ? "男性" : "女性"); } {// 这个模块是用来显示校验码是否正确的 int last = getCheck(str);// 存放最后一位计算出来的值,用于和输入的值进行比较 System.out.print("校验位:"); if ((str.substring(17, 18) + "").equals(String .valueOf(last)) || (str.substring(17).equals("x") && last == -1) || (str.substring(17).equals("X") && last == -1)) {// 比较最后一位是否和计算的值一致 System.out.println("正确。"); } else { System.out.println("错误,校验为应该是:" + ((last != -1) ? last : "x")); } } } else { System.out.println("你输入的内容不符合要求。"); } } } else {// 这里面判断不等于18位的 System.out.println("你输入的内容不符合要求。"); } System.out.println("------------------------------------------"); } } /** 判断当前年份下,当前月下有多少天,区分平闰年 */ public int getDays(int year, int month) {// 判断当前年份下,当前月下有多少天,区分平闰年 if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {// 这些月下,不管是平年,还是闰年,都是31天 return 31; } else if (month == 4 || month == 6 || month == 9 || month == 11) {// 这些月下,不管是平年,还是闰年,都是30天 return 30; } else { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {// 这是闰年 return 29; } else { // 这是平年 return 28; } } } /** 获取身份证校验码,参数是身份证字符串,返回值-1代表的是"x"或"X" */ public int getCheck(String str) { /** 这个变量用来存放所有校验和 */ int sum = 0; /** 这个数组里面存放的是身份证校验位系数,coefficient的缩写 */ int[] coe = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; /** 这个数组里面存放的是身份证校验对应的最后一位身份证号码 */ int[] check = { 1, 0, -1, 9, 8, 7, 6, 5, 4, 3, 2 };// -1代表的是"x"或"X" for (int i = 0; i < str.length() - 1; i++) { sum = sum + Integer.parseInt(str.charAt(i) + "") * coe[i]; } return check[sum % 11]; } /** 将全国各地区身份证省份代码插入到private Map city集合中 */ public void insert() { city.put(11, "北京市"); city.put(12, "天津市"); city.put(13, "河北省"); city.put(14, "山西省"); city.put(15, "内蒙古自治区"); city.put(21, "辽宁省"); city.put(22, "吉林省"); city.put(23, "黑龙江省"); city.put(31, "上海市"); city.put(32, "江苏省"); city.put(33, "浙江省"); city.put(34, "安徽省"); city.put(35, "福建省"); city.put(36, "江西省"); city.put(37, "山东省"); city.put(41, "河南省"); city.put(42, "湖北省"); city.put(43, "湖南省"); city.put(44, "广东省"); city.put(45, "广西壮族自治区"); city.put(46, "海南省"); city.put(5, "0重庆市"); city.put(51, "四川省"); city.put(52, "贵州省"); city.put(53, "云南省"); city.put(54, "西藏自治区"); city.put(61, "陕西省"); city.put(62, "甘肃省"); city.put(63, "青海省"); city.put(64, "宁夏回族自治区"); city.put(65, "新疆维吾尔自治区"); city.put(71, "台湾省(886)"); city.put(81, "香港特别行政区"); city.put(82, "澳门特别行政区"); } }