求解用java语言 编写一个身份证的类,可以用来验证身份证的长度,并可以显示地址码,生日,性别。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解用java语言 编写一个身份证的类,可以用来验证身份证的长度,并可以显示地址码,生日,性别。相关的知识,希望对你有一定的参考价值。

求解用java语言 编写一个身份证的类,可以用来验证身份证的长度,并可以显示地址码,生日,性别。

说明:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码(最后一位如果为奇数,代表男生,偶数代表女生)和一位数字校验码。

验证码的规则:
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;
最好可以解释一下每一步!!!!谢谢

参考技术A public static void main(String[] args)
Scanner input = new Scanner(System.in);
System.out.println("请输入十八位身份证号码!");
String id=input.next();
if(id.length()!=18)
System.out.println("身份证号码长度不对!");

String top=id.substring(0, 17);
String sishu="7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2";
String[] xishu=sishu.split(",");
int sum=0;
for (int i = 0; i < top.length(); i++)
int a=Integer.parseInt(top.charAt(i)+"");
int b=Integer.parseInt(xishu[i]);
sum+=a*b;

int xiaoyanjisuan=sum%11;
int xiaoyan=Integer.parseInt(id.substring(17, 18));
if(xiaoyanjisuan==xiaoyan)
System.out.println("身份证号码检测正确!");
else
System.out.println("身份证号码检测错误!");
return;

String dizhi=id.substring(0,6);
String nian=id.substring(6,10);
String yue=id.substring(10, 12);
String ri=id.substring(12,14);
int sex=Integer.parseInt(id.substring(16,17));
System.out.println("地址码为:"+dizhi);
System.out.println("生日为:"+nian+"年"+yue+"月"+ri+"日");
if(sex%2==0)
System.out.println("性别为:女");
else
System.out.println("性别为:男");

追问

谢谢!

追答

上面的那个回答没有考虑到x 请加上一个判断!

追问

可以,很不错

追答

int xiaoyan=Integer.parseInt(id.substring(17, 18));
if(xiaoyanjisuan==xiaoyan)
System.out.println("身份证号码检测正确!");
else
System.out.println("身份证号码检测错误!");
return;

请将上面的代码替换为下面的代码

String xiaoyans="1,0,X,9,8,7,6,5,4,3,2";
String [] xiaoyanshuzu=xiaoyans.split(",");
String getxiaoyan=xiaoyanshuzu[xiaoyanjisuan];
String xiaoyan=id.substring(17, 18);
if(getxiaoyan.equals(xiaoyan))
System.out.println("身份证号码检测正确!");
else
System.out.println("身份证号码检测错误!");
return;

参考技术B public class ID 

String[] lastId = "1","0","X","9","8","7","6","5","4","3","2";
int[] coefficient=7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;
int newNum=0;
char sex = '男';
static byte b = 'a';
void CheckID(String id)
if(id.length()!=18)
System.out.println("无效的身份证1");
return;

for(int i = 0;i<17;i++)
int nub =  Integer.parseInt(id.substring(i, i+1))*coefficient[i];//将前面的身份证号码17位数分别乘以不同的系数
newNum+=nub;//将这17位数字和系数相乘的结果相加

if(id.substring(17, 18).equals(lastId[newNum%11]))
System.out.println("证件有效");
System.out.println("地址码:"+id.substring(0, 6));
System.out.println("生日:"+id.substring(6, 14));
sex = Integer.parseInt(id.substring(16, 17))%2==0?'女':'男'; //最后一位如果为奇数,代表男生,偶数代表女生
System.out.println("性别:"+sex);
else
System.out.println("无效的身份证2");
return;






public static void main(String[] args) 
// TODO Auto-generated method stub
ID id = new ID();
id.CheckID("421083199101285617");






//这下对了

参考技术C package com.tarena;

@SuppressWarnings("unchecked")
public static String IDCardValidate(String IDStr) throws ParseException
String errorInfo = "";// 记录错误信息
String[] ValCodeArr = "1", "0", "x", "9", "8", "7", "6", "5", "4",
"3", "2" ;
String[] Wi = "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7",
"9", "10", "5", "8", "4", "2" ;
String Ai = "";
// ================ 号码的长度 15位或18位 ================
if (IDStr.length() != 15 && IDStr.length() != 18)
errorInfo = "身份证号码长度应该为15位或18位。";
return errorInfo;

// =======================(end)========================
// ================ 数字 除最后以为都为数字 ================
if (IDStr.length() == 18)
Ai = IDStr.substring(0, 17);
else if (IDStr.length() == 15)
Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);

if (isNumeric(Ai) == false)
errorInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";
return errorInfo;

// =======================(end)========================
// ================ 出生年月是否有效 ================
String strYear = Ai.substring(6, 10);// 年份
String strMonth = Ai.substring(10, 12);// 月份
String strDay = Ai.substring(12, 14);// 月份
if (isDate(strYear + "-" + strMonth + "-" + strDay) == false)
errorInfo = "身份证生日无效。";
return errorInfo;

GregorianCalendar gc = new GregorianCalendar();
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
|| (gc.getTime().getTime() - s.parse(
strYear + "-" + strMonth + "-" + strDay).getTime()) < 0)
errorInfo = "身份证生日不在有效范围。";
return errorInfo;

if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0)
errorInfo = "身份证月份无效";
return errorInfo;

if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0)
errorInfo = "身份证日期无效";
return errorInfo;

// =====================(end)=====================
// ================ 地区码时候有效 ================
Hashtable h = GetAreaCode();
if (h.get(Ai.substring(0, 2)) == null)
errorInfo = "身份证地区编码错误。";
return errorInfo;

// ==============================================
// ================ 判断最后一位的值 ================
int TotalmulAiWi = 0;
for (int i = 0; i < 17; i++)
TotalmulAiWi = TotalmulAiWi
+ Integer.parseInt(String.valueOf(Ai.charAt(i)))
* Integer.parseInt(Wi[i]);

int modValue = TotalmulAiWi % 11;
String strVerifyCode = ValCodeArr[modValue];
Ai = Ai + strVerifyCode;
if (IDStr.length() == 18)
if (Ai.equals(IDStr) == false)
errorInfo = "身份证无效,不是合法的身份证号码";
return errorInfo;

else
return "";

// =====================(end)=====================
return "";


@SuppressWarnings("unchecked")
private static Hashtable GetAreaCode()
Hashtable hashtable = new Hashtable();
hashtable.put("11", "北京");
hashtable.put("12", "天津");
hashtable.put("13", "河北");
hashtable.put("14", "山西");
hashtable.put("15", "内蒙古");
hashtable.put("21", "辽宁");
hashtable.put("22", "吉林");
hashtable.put("23", "黑龙江");
hashtable.put("31", "上海");
hashtable.put("32", "江苏");
hashtable.put("33", "浙江");
hashtable.put("34", "安徽");
hashtable.put("35", "福建");
hashtable.put("36", "江西");
hashtable.put("37", "山东");
hashtable.put("41", "河南");
hashtable.put("42", "湖北");
hashtable.put("43", "湖南");
hashtable.put("44", "广东");
hashtable.put("45", "广西");
hashtable.put("46", "海南");
hashtable.put("50", "重庆");
hashtable.put("51", "四川");
hashtable.put("52", "贵州");
hashtable.put("53", "云南");
hashtable.put("54", "西藏");
hashtable.put("61", "陕西");
hashtable.put("62", "甘肃");
hashtable.put("63", "青海");
hashtable.put("64", "宁夏");
hashtable.put("65", "新疆");
hashtable.put("71", "台湾");
hashtable.put("81", "香港");
hashtable.put("82", "澳门");
hashtable.put("91", "国外");
return hashtable;


private static boolean isNumeric(String str)
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (isNum.matches())
return true;
else
return false;



public static boolean isDate(String strDate)
Pattern pattern = Pattern
.compile("^((//d2(([02468][048])|([13579][26]))[//-/////s]?((((0?[13578])|(1[02]))[//-/////s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[//-/////s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[//-/////s]?((0?[1-9])|([1-2][0-9])))))|(//d2(([02468][1235679])|([13579][01345789]))[//-/////s]?((((0?[13578])|(1[02]))[//-/////s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[//-/////s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[//-/////s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(//s(((0?[0-9])|([1-2][0-3]))//:([0-5]?[0-9])((//s)|(//:([0-5]?[0-9])))))?$");
Matcher m = pattern.matcher(strDate);
if (m.matches())
return true;
else
return false;

编写Java程序,用于显示学生的姓名和年龄、专业。

要求:编写一个学生类,该类有姓名和年龄、专业三个属性,定义构造方法,用来初始化数据成员,再定义显示方法,将姓名和年龄、专业信息打印输出。 再编写测试类,通过在main方法中创建学生实例,然后将信息显示出来。

急急急

java是面向对象的编程语言,一切皆为对象。本题虽然基础,但是特别有代表性。在做这类java编程时也应该引入面向对象的思维。

一学生类属性的定义:

1.拥有三个属性,姓名,年龄和专业

姓名,是用文字进行表述的,所以可以使用String 字符串类型

年龄,大家都说18,19岁,一般很少听人说18.725岁,所以我们可以使用int整数类型来表示

专业,也是用文字进行表述的,所以还是用String字符串类型

2. 修饰符:java为了更好的封装,所以属性一般要用private进行修饰,

但是可以用setter对属性进行修改,也可以用getter对属性进行读取

二构造方法的设计

为了符合java开发的规范和习惯,需要添加一个无参数的构造器。

有参数的构造方法,需要对属性进行初始化设置

三方法的设置

除开属性的setter和getter方法外。

符合开发规范,还需要重写toString方法。用于返回字符串

所以我们显示(打印)信息时,也可以直接调用toString返回的字符串,然后打印

四 参考代码和注释

学生类

public class Student //定义学生类
private String name;//属性 姓名
private int age;//属性 年龄
private String major;//属性 专业

public Student() //无参数的构造法: 为了符合java开发规范和习惯,添加一个无参构造器


public Student(String name, int age, String major) //有参的构造方法,初始化属性
this.name = name;
this.age = age;
this.major = major;

public void ShowInfo()//显示信息的方法
System.out.println(this);//打印时,自动调用toString方法,把该实例打印出来


public String toString() //重写父类的toString方法,也是符合java规范的
return "【学生】\\t姓名:"+name+"\\t年龄:"+age+"\\t专业:"+major;


//下面是属性的get和set方法,getter用于获取属性的值,setter用于设置或修改属性的值
public String getName() 
return name;


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


public int getAge() 
return age;


public void setAge(int age) 
this.age = age;


public String getMajor() 
return major;


public void setMajor(String major) 
this.major = major;

测试类

public class Test 
public static void main(String[] args) 
Student s1 = new Student("张三", 19, "汉语语言文学");//调用有参数的构造器,创建学生实例
s1.ShowInfo();//显示信息
Student s2 = new Student();//调用无参数的构造器,创建学生实例
s2.setName("李四");//设置属性的值
s2.setAge(20);
s2.setMajor("计算机科学与技术");
s2.ShowInfo();


测试结果

【学生】 姓名:张三 年龄:19 专业:汉语语言文学
【学生】 姓名:李四 年龄:20 专业:计算机科学与技术

五总结

通过这种基础编程,主要训练我们面向对象的思维,以及养成良好的编程习惯。

参考技术A //学生类
public class Student
    String name;
    int age;
    String major;
    public Student(String name, int age, String major)
        this.name = name;
        this.age = age;
        this.major = major;
    
    public void print()
        System.out.println("name:"+ name);
        System.out.println("age:" + age);
        System.out.println("major:" + major);
    

//测试类
class Test
    public static void main(String [] args)
        Student stu = new Student("Jack", 15, "computer");
        stu.print();
    

这是最基本的java知识,没事看看java基础吧,我开始也是啥也不会,后来大四了,感觉不能这么混下去,就自己看视频,自学了点东西。起码为找工作学点。。

参考技术B public class Student 
private String name;
private int age;
private String course;

public Student() 


public Student(String name, int age, String course) 
this.name = name;
this.age = age;
this.course = course;


public void printInfo()
System.out.println("姓名:" + this.name);
System.out.println("年龄:" + this.age);
System.out.println("专业:" + this.course);


public static void main(String[] args) 
Student student = new Student("张三", 20, "英语");
student.printInfo();


public String getName() 
return name;


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


public int getAge() 
return age;


public void setAge(int age) 
this.age = age;


public String getCourse() 
return course;


public void setCourse(String course) 
this.course = course;


参考技术C 学生类:
public class Student
public String name;
public String age;
public String profession;
public Student(String name,String age,String profession)
   System.out.println("name:"+name+"age:"+age+"profession:"+profession);



public class Test
public static void main(String[] args) 
     Student student=new Student("join","12","history");

以上是关于求解用java语言 编写一个身份证的类,可以用来验证身份证的长度,并可以显示地址码,生日,性别。的主要内容,如果未能解决你的问题,请参考以下文章

一、编程Customer.java:在其中编写一个名为Customer的类。

Java语言中,用JDBC编写数据库应用程序需要哪几步?

用C语言怎么编写一个从1加到10的程序...新手求解

中控脚本用啥写比较好

java编程思想之注解

Python调用问题,求解