身份证号判断是否合法(具体代码)

 通过身份证号判断是否合法、省份、性别、出生日期、生肖、星座的具体代码:

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;
		    //定义字符串型ID
		    int 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);
}

}

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值