通过身份证号判断是否合法、省份、性别、出生日期、生肖、星座的具体代码:
import java.util.Calendar;
import java.util.Scanner;public class Idcard {public static void main(String[] args) {yixuewen();}/*根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定:公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。1-2位:前两位代表各省级政府的代码。3-4位:3-4位代表地、市级政府代码。5-6位:5-6位代表县、区级政府代码。*/
/*校验码计算方法
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。
*(即余数0对应1,余数1对应0,余数2对应X...)
5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。
*如果对应的数字是2,身份证的最后一位号码就是罗马数字X。
*/
private static final int[] weight=new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
/*前面的身份证号码17位数分别乘以的系数:* 从第一位到第十七位的系数分别为:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2。*/
private static final int[] checkDigit=new int[]{1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 };//对应的校验码,判断身份证最后一位数字
public static void yixuewen(){Scanner sc=new Scanner(System.in);//键盘录入String id;//定义字符串型IDint arr[]=new int[18];//创建数组int sum=0; //定义整数类型变量sum将这17位数字和系数相乘的结果相加int flag=0; //定义整数类型变量flag存储余数System.out.println("请输入身份证号码:");id=sc.next();//判断身份证是否合法for(int a=0;a<3;a++);{while(id.matches("^\\d{17}[0-9X]$")==false){
//String.matches() 这个方法主要是返回是否匹配指定的字符串,如果匹配则为true,否则为false
//正则表达式定义:用一些特殊符号表达一些有规律的式子//身份证:18数字 最后一位可为x // 身份证的正则表达式:/^\\d{17}[0-9x]$/System.out.println("ERROR!输入有误!请重新输入");id=sc.next();}for(int i=0;i<18;i++){arr[i]= Integer.parseInt(id.substring(i, i+1));//Integer.parseInt(String)就是将String字符类型数据转换为Integer整型数据。//使用Id.substring(i, i+1)方法可取出号码的每一位
/*
substring()
用于返回一个字符串的子串
在String中:substring(start,stop)
start:表示子字符串的开始位置,
stop:表示结束结果。
注意:第二个参数应该大于第一个参数。
*/if(i!=17){sum+=weight[i]*arr[i]; //原式:sum=sum+weight[i]*arr[i]; }}flag=sum%11; //得出余数if(checkDigit[flag]==arr[arr.length-1]){//判断余数是否与身份证号最后一位对应System.out.println("您的身份证是合法的!"); }else{System.out.println("您的身份证是不合法的!");}}//判断省份
String code[] = { "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", "91" };String city[] = {"北京市","天津市","河北","山西","内蒙古","辽宁","吉林","黑龙江","上海市","江苏","浙江","安徽","福建","江西","山东", "河南","湖北","湖南","广东","广西","海南","重庆市","四川","贵州","云南","西藏","陕西","甘肃","青海","宁夏","新疆","台湾","香港","澳门","国外"};
String cd=(id.substring(0,2)); //取身份证前两位
int a;
for(a=0;a<city.length;a++) {if(cd.equals(code[a])) {break;//找到对应的省份退出循环}
}
System.out.println("你输入的身份证省份为:"+city[a]);//判断性别
String gender=(id.substring(16,17));
int b=Integer.valueOf(gender);
if(b%2==0) {System.out.println("你输入的身份证号的人的性别是:女性");
}
else System.out.println("你输入的身份证号的人的性别是:男性");//判断出生日期
String year =id.substring(6,10);
String month=id.substring(10,12);
String day=id.substring(12,14);
System.out.println("你输入的身份证号的人的出生日期为:"+year+"年"+month+"月"+day+"日");//判断年龄
String birthday =id.substring(6,14);
Calendar now = Calendar.getInstance();
/*使用Calendar.getInstance()不仅能获取当前的时间* 还能指定需要获取的时间点* 并可以进行时间的计算*/
int nowYear = now.get(Calendar.YEAR);
int nowMonth = (now.get(Calendar.MONTH)+1);
/**指示月份的 get 和 set 的字段数字*因为这个值的初始值是0*因此我们要用它来表示正确的月份时就需要加1*/
int nowDay = now.get(Calendar.DAY_OF_MONTH);
/** get 和 set 的字段数字,指示一个月中的某天。* 它与 DAY_OF_MONTH 是同义词。* 一个月中第一天的值为 1。* 根据定义我们可以知道* 这个值取得后不需要做任何变更就是程序需要的值*/int year1 = Integer.valueOf(birthday.substring(0,4));
int month1= Integer.valueOf(birthday.substring(4,6));
int day1 = Integer.valueOf(birthday.substring(6));
/*Integer.valueOf()将基本类型int转换为包装类型Integer
*或者将String转换成Integer,String如果为Null或“”都会报错。
*Integer.valueOf()是Integer类的一个静态方法,
*当括号中的变量值在-128~127之间时,其不会创建对象,而是指向现有的自动装箱的对象。
*如果没有其会自己创建一个。
*/
int age = nowYear-year1;
if(age<=0) {System.out.println("ERROR!错误!");}
else if(nowMonth-month1>0) {System.out.println("你输入的身份证的人的当前年龄为:"+age);}
else if(nowMonth-month1>0) {if(nowDay-day1>=0) {System.out.println("你输入的身份证的人的当前年龄为:"+age);}}
else System.out.println("你输入的身份证的人的当前年龄为:"+(age-1));//判断生肖
int year2 = Integer.valueOf(birthday.substring(0,4));
String zodia[]={"子鼠","丑牛","寅虎","卯兔","辰龙","巳蛇","午马","未羊","申猴","酉鸡","戌狗","亥猪"};
int i=(year2-4)%12;
String value=zodia[i];
System.out.println("你输入的身份证的人的生肖为:"+value);//判断星座
int month2= Integer.valueOf(birthday.substring(4,6));
int day2 = Integer.valueOf(birthday.substring(6));
String value1="";if(((month2==3) && (day2 >=21)) || ((month2==4) &&(day2<=19))) value1="白羊座";
if(((month2==4) && (day2 >=20)) || ((month2==5) &&(day2<=20))) value1="金牛座";
if(((month2==5) && (day2 >=21)) || ((month2==6) &&(day2<=21))) value1="双子座";
if(((month2==6) && (day2 >=22)) || ((month2==7) &&(day2<=22))) value1="巨蟹座";
if(((month2==7) && (day2 >=23)) || ((month2==8) &&(day2<=22))) value1="狮子座";
if(((month2==8) && (day2 >=23)) || ((month2==9) &&(day2<=22))) value1="处女座";
if(((month2==9) && (day2 >=23)) || ((month2==10) &&(day2<=23))) value1="天秤座";
if(((month2==10) && (day2 >=24)) || ((month2==11) &&(day2<=22))) value1="天蝎座";
if(((month2==11) && (day2 >=23)) || ((month2==12) &&(day2<=21))) value1="射手座";
if(((month2==12) && (day2 >=22)) || ((month2==1) &&(day2<=19))) value1="摩羯座";
if(((month2==1) && (day2 >=20)) || ((month2==2) &&(day2<=18))) value1="水瓶座";
if(((month2==2) && (day2 >=19)) || ((month2==3) &&(day2<=20))) value1="双鱼座";System.out.println("你输入的身份证的人的星座为:"+value1);
}}