我是靠谱客的博主 潇洒洋葱,最近开发中收集的这篇文章主要介绍2020-12-17,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

用Java身份证验证

Java小白,,,这是我们Java实验课要求写的验证身份证的代码,有什么错误也请大佬提出来哈。

身份证号码验证及个人信息输出。
在网页、管理信息系统中,我们经常会要求用户输入身份证号码,由于身份
证号码较长,经常容易产生录入错误,本验证可以有效防止用户录用错误。
其实身份证中还包含了用户的个人信息,包含出生地、生日、性别的等内容。
如:51 01 03 19XX 01 03 028 X
为:省 市 区 出生年 月 日 顺序码 校验码
1、身份证验证主要包含:
○1 位数错误:正确应该为 18 位。
○2 字符错误:前面 17 个应该是数字,最后一位可以为‘X’或‘x’;
○3 校验码错误:
身份证的最后一位为校验码,校验码是用于验证前面的数字是否有错误,校
验码运算规则:
13
(1)先将最后一位设定为 0。
(2)效验码的计算公式为:(Σ (ai×wi))%11
其中:i 是从右向左的包括效验码在内的序号(1-18)
ai 是第 i 位的数字
wi 是第 i 位上的加权因子,其数值依据公式 wi=(2(i-1))%11,(计算 ab:函数为:java.lang.Math.pow(a,b))
i,ai,wi 的对应关系如下:
证号码:5 1 0 1 0 1 1 9 8 8 0 8 0 8 0 1 2 0
i:18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
ai:5 1 0 1 0 1 1 9 8 8 0 8 0 8 0 1 2 0
wi: 用公式计算 2^(i-1)%11 …… 9 10 5 8 4 2 1
(3)求出(Σ (ai×wi))%11 之后依据下表得到效验码:
(Σ (ai×wi))%11 0 1 2 3 4 5 6 7 8 9 10
效验码值 1 0 X 9 8 7 6 5 4 3 2
(3)计算 a
b:函数为:java.lang.Math.pow(a,b)
2、个人信息输出主要包含:
○1 生日:如 1985 年 5 月 9 日。
○2 年龄:如 20 岁,应当精确到日;
○3 性别:顺序码的计数为,男性以奇数计数,女性以偶数计数
要求:
(1)编写一个身份证类,包含一个属性:身份证号;三个验证函数;一个
信息输出函数。
(2)编写一个测试类,可从键盘上输入一个身份证号码,产生一个身份证
对象,然后调用其相关方法对身份证号码进行验证,没有通过验证的话,提示错
误信息并让用户重新输入,如果通过验证,则输出该人的信息。

package cardid;
import java.util.*;
import java.text.*;
public class CardID {
private String cardNum;
public int Y,M,D;
public int birDay,birYear,birMonth,dif,sex,day,month,year; //出生日 年 月,年龄,性别,现在日 月 年 
public String curr;
public boolean z;
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
public boolean lengthVerify(){//①位数错误验证
return this.cardNum.length()==18;
}
public boolean charVerify() {//②字符错误验证
boolean A = true;
char[] Arr = cardNum.toCharArray();
for(int i = 0;i<cardNum.length();i++) {
if(Arr[i]-'0'<0||Arr[i]-'0'>9) {
A = false;
}
}
if(Arr[cardNum.length()-1] == 'x' ||Arr[cardNum.length()-1] == 'X') {
A = true;
}
return A;
}
public boolean checkcodeVerity() {//③校验码错误验证,测试时请将每一轮的i,ai,wi,sum输出,避免出错
String testNum = this.cardNum.substring(0,17)+"0";
int i = 18,ai,wi,sum = 0;
for(i = 18;i>=1;i--) {
ai=testNum.charAt(18-i)-48;
wi = (int)Math.pow(2,i-1)%11;
sum+=ai*wi;
}
int mod = sum % 11;
char last[] = {'1','0','X','9','8','7','6','5','4','3','2'};
System.out.println("正确的校验码为:"+last[mod]);
return this.cardNum.toUpperCase().charAt(17) == last[mod];
}
public void output() {//④信息输出,按要求输出个人信息
birYear = Integer.parseInt(cardNum.substring(6,10));
birDay = Integer.parseInt(cardNum.substring(12,14));
birMonth = Integer.parseInt(cardNum.substring(10,12));
dif = Y - birYear;
sex = Integer.parseInt(cardNum.substring(16,17));
Date crr = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd--hh:mm:ss");
curr = sdf.format(crr);
String D[] = curr.split("-");
year = Integer.parseInt(D[0]);
day = Integer.parseInt(D[2]);
month = Integer.parseInt(D[1]);
dif = year - birYear;
if(month == birMonth && day < birDay) {
dif--;
}
if(month < birMonth) {
dif--;
}
System.out.println("出生日期为:"+birYear+"年"+birMonth+"月"+String.format("%02d", birDay)+"日");
System.out.println("你的年龄为:"+dif);
if(sex % 2 == 1) {
System.out.println("性别:男");
}else {
System.out.println("性别:女");
}
}
}
package cardid;
import java.util.Scanner;
public class CardIDDemo {
public static void main(String[]args) {
//用死循环反复测试输入,验证,输出。注意第一步验证失败不能进入第二步,第二步失败不能进入第三步,所有验证通过才能进行输出。
CardID t = new CardID();
String id = " ";
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("请输入需要验证的身份证号:");
id = sc.nextLine();
t.setCardNum(id);
//t.scanf ();
if(!t.lengthVerify()) {
System.out.println("长度有错!请重新输入。");
}
else if(!t.charVerify()){
System.out.println("输入非数字字符!请重新输入。");
}
else if(!t.checkcodeVerity()) {
System.out.println("最后一位验证码错误!请重新输入。");
}
else {
t.output();
}
}
}
}

最后

以上就是潇洒洋葱为你收集整理的2020-12-17的全部内容,希望文章能够帮你解决2020-12-17所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部