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);
}
}
身份证验证 输出(是否伴侣,出生日期,星座)
最新推荐文章于 2024-07-30 20:50:32 发布