【Java】编写身份证号码校验工具
本帖最后由 wushaominkk 于 2018-4-27 17:47 编辑很久之前楼主闲的无聊做Java校验身份证,其实算法我也找了,最开始根本不理解,后来慢慢接受的,所以当时刚理解就开始做
算法层次还是停留在加减法,希望大家不要介意,下面给大家介绍一下写的这些东西
private String num = null;//声明的身份证号码
public Jiao() {//无参构造方法
super();
}
public Jiao(String num) {//有参构造方法
super();
this.num = num;
JiaoYan(num);
}
public void JiaoYan(String fhz){//校验方法
if(num.length()==18){
int qq = 0;//截取字符的起点
String year = num.substring(qq+6, qq+10);//截取年
String yue = num.substring(qq+10, qq+12);//截取月
int y=Integer.parseInt(yue);
String ri = num.substring(qq+12, qq+14);//截取日
int r=Integer.parseInt(ri);
int nyr=Integer.parseInt(year+yue+ri);
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//设置日期格式
int rq=Integer.parseInt(df.format(new Date()));
System.out.println(rq);// new Date()为获取当前系统时间
int iW[]={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int sum=0;
int sum1=0;
int pd;
if(nyr<rq&&nyr>19000000){
if((y>00&&y<=12)&&(r>00&&r<=31)){
System.out.println(year+"年"+yue+"月"+ri+"日");
String sz [] = new String ;
int zx[]=new int ;
for(int i=0;i<sz.length;i++){
String sr =num.substring(i, i+1);
sz=sr;
zx=Integer.parseInt(sz);
sum=iW*zx;
sum1=sum+sum1;
}
pd=sum1%11;
String zh=num.substring(17);
switch(pd){
case 0:
if(zh.equals("1")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 1:
if(zh.equals("0")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 2:
if(zh.equals("X")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 3:
if(zh.equals("9")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 4:
if(zh.equals("8")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 5:
if(zh.equals("7")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 6:
if(zh.equals("6")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 7:
if(zh.equals("5")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 8:
if(zh.equals("4")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 9:
if(zh.equals("3")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
case 10:
if(zh.equals("2")){
System.out.println("验证成功");
fhz=num;
}else{
System.out.println("验证失败");
}
break;
}
}else{
System.out.println("出生日期错误");
fhz="出生日期错误";
}
}else{
System.out.println("出生年月日错误");//年月日错误,结束
fhz="出生年月日错误";
}
}else{
System.out.println("输入错误,长度不对");
fhz="输入错误,长度不对";
}
}
下面就是测试类,创建对象的时候调用的无参构造器,记得导包哦
System.out.println("请输入自己的身份证号码");
Scanner in=new Scanner(System.in);
Jiao j=new Jiao(in.next());
测试图在下方,身份证号码网上随便搜的一个,有一些大家用不到,但是为了证明一下,所以打印出来了
package 身份证验证小程序;
import java.util.Scanner;
public class Test
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入18位身份证:");
while(true)
{
String str = sc.nextLine();
char[] arr =str.toCharArray();
if(panduan(arr))
{
System.out.println("输入正确!");
break ;
}
System.out.println("输入错误,请重新输入:");
}
}
public static boolean panduan(char[] arr)
{
int weight[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char map[] = {'1','0','X','9','8','7','6','5','4','3','2'};
int sum = 0 ;
for(int i = 0 ; i < 17 ; i++)
{
sum += (arr-'0') * weight;
}
int i = sum%11 ;
char c = arr;
if(map == c)
{
return true ;
}
return false ;
}
}
anttu 发表于 2017-11-22 20:07
身份证号校验无法用正则,六位数字地址码+八位数字出生日期码+三位数字顺序码+一位数字校验码,正则做不到
身份证号规则,前六位(省市县各2位),中间八位出生年月日(8位),后边两位是登记户籍时派出所的编号(当地的编号,可能是乡镇级),倒数第二位性别(男单。女双),最后一位校验码(通过这个公式算出来的校验码)。。。
但,计算做出来了,这个身份证号码是否存在那就不得而知了,所以只能用作校验身份证号码,不能判断实名制真实性 我记得这个昨天谁发过 谢谢分享 那些零碎的回忆,渐渐失去了方向。 可以,老铁辛苦了。可以注册一些网站使用XX 挺好,谢谢分享 学习一下,最近在学JAVA 准备学这个的,等考研结束 支持一下,我也是编程新手 查询准确吗, 这个很适合新手练习用,粗略的看了一眼,这个应该涉及到了字符串的分割、switch语句、if判断等等!