身份证验证 输出(是否伴侣,出生日期,星座)

package test;

import java.util.Calendar;


public class Person {
	private String id;
	private String name;
	private String phone;

	public Person() {

	}

	public Person(String id, String name) {
		this.id = id;
		this.name = name;
		
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String phone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	// 省份
	public String getprov() {
		String[] s = { "11: 北京", "12: 天津", "13: 河北", "14: 山西", "15: 内蒙古", "21: 辽宁", "22: 吉林", "23: 黑龙江", "31: 上海",
				"32: 江苏", "33: 浙江", "34: 安徽", "35: 福建", "36: 江西", "37: 山东", "41: 河南", "42: 湖北", "43: 湖南", "44: 广东",
				"45: 广西", "46: 海南", "50: 重庆", "51: 四川", "52: 贵州", "53: 云南", "54: 西藏", "61: 陕西", "62: 甘肃", "63: 青海",
				"64: 宁夏", "65: 新疆", "71: 台湾", "81: 香港", "82: 澳门" };
		String sf = id.substring(0, 2);
		for (int i = 0; i < s.length; i++) {
			String sz = s[i].substring(0, 2);
			if (sf.equals(sz)) {
				return s[i];
			}
		}
		return "无法查出,不合法";

	}

	@SuppressWarnings("unused")
	   //根据birthday的 年 月 日的值结合当前系统时间的 年 月 日的值
	public  int  getAge(){
		Calendar today=Calendar.getInstance();
		
		int todayYear=today.get(Calendar.YEAR);
		int todayMonth=today.get(Calendar.MONTH);
		int todayDay=today.get(Calendar.DAY_OF_MONTH);
		int birthYear=Integer.parseInt(id.substring(6,10));
		int birthMonth=Integer.parseInt(id.substring(10,12));
		int birthDay=Integer.parseInt(id.substring(12,14));
		
		if(todayMonth>birthMonth){
			return todayYear-birthYear;
		}else if(todayMonth<birthMonth){
			return todayYear-birthYear-1;
		}else if(todayDay>=birthYear){
			return todayYear-birthYear;
		}else{
			return todayYear-birthYear-1;
		}
		
	}
	// 星座
	public String getConstellation() {
		int month = Integer.parseInt(id.substring(10, 12));
		int day = Integer.parseInt(id.substring(12, 14));

		if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) {
			return ("水瓶座");
		}
		if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) {
			return ("双鱼座");
		}
		if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) {
			return ("白羊座");
		}
		if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) {
			return ("金牛座");
		}
		if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) {
			return ("双子座");
		}
		if ((month == 6 && day >= 22) || (month == 7 && day <= 22)) {
			return ("巨蟹座");
		}
		if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) {
			return ("狮子座");
		}
		if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) {
			return ("处女座");
		}
		if ((month == 9 && day >= 23) || (month == 10 && day <= 23)) {
			return ("天秤座");
		}
		if ((month == 10 && day >= 24) || (month == 11 && day <= 22)) {
			return ("天蝎座");
		}
		if ((month == 11 && day >= 23) || (month == 12 && day <= 21)) {
			return ("射手座");
		} else {
			return "摩羯座";
		}

	}
	// 性别
	public String getSex() {
		int sex = id.charAt(16) - '0';// 化整(只用于单个数化整) 0的ASCII的值为48
		if (sex % 2 == 0) {
			return "女";
		} else {
			return "男";

		}
		/*
		 * char ch = id.charAt(16); int c = ch -'0'; //字符串转为数字 if(c%2==0){
		 * System.out.println("性别为女"); }else{ System.out.println("性别为男"); }
		 */
	}

	public boolean getMarry(Person p) {
		if (this.getSex().equals(p.getSex())) {//字符串比较用equals
			System.out.println("同性不能结婚");
			return false;
		}

		if (this.getSex().equals("男") && this.getAge() >= 22) {
			if (p.getSex().equals("女") && p.getAge() >= 20) {
				System.out.println("可以结婚");
				return true;
			} else {
				System.out.println("不合法,不可以结婚");
				return false;
			}
		}
		if (this.getSex().equals("女") && this.getAge() >= 22) {
			if (p.getSex().equals("男") && p.getAge() >= 20) {
				System.out.println("合法,可以结婚");
				return true;
			} else {
				System.out.println("不合法,不可以结婚");
				return false;
			}
		}
		return false;

	}

	public String toString() {
		return "身份证号:   " + id + "  姓名:   " + name + "  年龄:   " + getAge() + "  性别:" + getSex() + " 星座:" + getConstellation()+ "   省份:" + getprov();
	}
}

package test;

import java.util.Comparator;
public class BirthComparator implements Comparator<Person>{
	public int compare(Person p1, Person p2){
		return p1.getId().substring(6, 14).compareTo(p1.getId().substring(6, 14));
	}

}

package test;

import java.util.ArrayList;
import java.util.Collections;//集合
import java.util.Comparator;//比较器
import java.util.Scanner;

@SuppressWarnings("unused")
public class TestSfz {
	// 判断前十七为是否为数字
	public static boolean isCorrectNum(String id) {
		for (int i =  id.length() - 2;i>=0; i--) {
			char ch = id.charAt(i);// charAt()方法返回指定索引位置的char值。索引范围为0~length()-1.
			if (ch >= '0' && ch <= '9') {
				return true;
			}
		}
		return false;
	}

	// 省份验证
	private static boolean isCorrectProv(String id) {
		String[] le = { "11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41",
				"42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81",
				"82" };
		for (int i = 0; i < le.length; i++) {
			if (id.substring(0, 2).equals(le[i])) {
				return true;
			}
		}
		return false;
	}

	// 判断生日是否合法
	private static boolean isCorrtctBirthDay(String id) {
		int year = Integer.parseInt(id.substring(6, 10));
		int month = Integer.parseInt(id.substring(10, 12));
		int day = Integer.parseInt(id.substring(12, 14));
		if (year < 0) {
			return false;
		}
		if (month < 1 || month > 12) {
			return false;
		}
		int maxday = 31;
		if (day < 1 || day > 31) {
			return false;
		}
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
			maxday = 31;
		}
		if ((month == 2 && year % 400 == 0 && year % 100 != 0)) {
			maxday = 29;
		}
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
			maxday = 31;
		} else {
			maxday = 30;
		}
		if (day > maxday) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 身份证验证规则: 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5
	 * 8 4 2 1 6 3 7 9 10 5 8 4 2 2.将这17位数字和系数相乘的结果相加。 3.用加出来和除以11,看余数是多少? 4.余数只可能有0
	 * 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
	 * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。依此类推。
	 */
	// 身份证校验码
	public static boolean isVarifyCode(String id) {
	int sum = 0;
	int[] weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
	char[] code = { '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2' };
	for (int i = 0; i < weight.length; i++) {
		// 将这17位数字和系数相乘的结果相加。
		sum += Integer.parseInt(id.substring(i, i + 1)) * weight[i];
	}
	int mod = sum % 11;
	if (code[mod] == id.charAt(17)) {
		return true;
	}
	return false;	
	}
	// 判断身份证合法性
	private static boolean isCorrectId(String id) {
		if (id.length() != 18) {
			return false;
		}
		if (!isCorrectNum(id)) {
			System.out.println("前十七位不全是数字");
			return false;
		}
		if (!isCorrectProv(id)) {
			System.out.println("省份错误");
			return false;
		}
		if (!isCorrtctBirthDay(id)) {
			System.out.println("生日错误");
			return false;
		}
		if (!isVarifyCode(id)) {
			System.out.println("校验码错误");
			return false;
		}

		return true;
	}

	

	public static void show(ArrayList<Person> list) {
		System.out.println();
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		Person p1 = new Person();
		System.out.println("请输入自己的身份证号码");
		String id1 = sc.next();
	    p1.setId(id1);
	    //System.out.println(p1.getConstellation());
		Person p2 = new Person();
		System.out.println("请输入伴侣的身份证号码");
		String id2 = sc.next();
		p2.setId(id2);
		p1.getMarry(p2);
		ArrayList<Person> list = new ArrayList<Person>();
		while (true) {
			System.out.println("请输入姓名");
			String name;
			name = sc.next();
			System.out.println("请输入身份证号");
			String id;
			id = sc.next();
			if (id.equals("-1")) {
				break;
			}
			if (!isCorrectId(id)) {
				System.out.println("身份证输入不合法,请重新输入");
				continue;
			}
			Person p = new Person(id,name);
			list.add(p);

		}
		Collections.sort(list, new BirthComparator());
		System.out.println("\n按年龄排序后:");
		show(list);
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值