JHR姓jiang 2021-10-29 16:56 采纳率: 100%
浏览 59
已结题

这个程序有毛病 具体在程序最上方有说明

//这个程序 不是很完整  主要作用就是输入身份证号,判断身份证号是否合法 (只需要看够不够十八位,尾数是数字或者x)如果合法 输出出生年月日 性别 年龄   现在这个程序 判断尾数那有问题   计算年龄没写出来  能不能帮优化一下 把没写的写上  有错的地方改一下
package com;

import java.util.*;
public class ID {

    private static Scanner scanner;


    // 入口
    public static void main(String[] args) {

        scanner = new Scanner(System.in);
        System.out.println("请输入您的身份证号:");
        String idNumber = scanner.nextLine();

  
        // 判断身份证号是否合法
        Boolean idLegit = judgeId(idNumber);
        if(idLegit){
            String birthday = getBirthday(getStr(idNumber,6,13));
            String gender = getGender(getStr(idNumber,16,16));
            String age = getAge(getStr(idNumber,6,9));
            System.out.println("您的生日:" + birthday);
            System.out.println("您的性别:" + gender);
            System.out.println("您的年龄:" + age);
      }else System.out.println("身份证号有误!!!!");
        
    }

    //判定身份证号是否正确  正确的为18位 末尾为数字或者字母x
    public static Boolean judgeId(String id){
        if(id.length() != 18)
            return false;

        
        char[] end = {'1','2','3','4','5','6','7','8','9','0','x'};
        boolean sum = true;
        
        for(int  i =0;i<end.length;i++){
           
            if(end[i] != getStr(id,17, 17).charAt(0)){
                sum = true;
            }else{
                sum = false;
            }
            
        }
        return sum;
    }
        
    
    
    public static String getStr(String str,int a,int b){
        b++;
        return str.substring(a,b);
    }


   

    //提取出生年月日
    public static String getBirthday(String num){
        String y = getStr(num,0,3);
        String m = getStr(num,4,5);
        String d = getStr(num,6,7);
        return y + "-" + m + "-" + d;
    }

  //判断性别
    public static String getGender(String num){
        int gendetNum = num.charAt(0) - '0';
        return gendetNum % 2 == 0 ? "女" : "男";
    }
    
//计算年龄,这个代码不完整
    public static String getAge(String num){
    String age = getStr(num,0,3);
    int new_age = Integer.valueOf(age);//    强制转换
    Calendar date = Calendar.getInstance();
    String year = String.valueOf(date.get(Calendar.YEAR));
    int new_year = Integer.valueOf(year);

    return age;
}
}
  • 写回答

5条回答 默认 最新

  • Winson.J 2021-10-29 17:27
    关注
    1. judgeId()方法是不正确的,只要最后一位不是x,前面17随便输都返回true
    2. 比较的逻辑也不对,每次都比最后一位,前面的17位都没有检查
      只改了检查身份证号和计算年龄的代码
      身份证数字含义参考

    img

    // 判定身份证号是否正确 正确的为18位 末尾为数字或者字母x
        public static Boolean judgeId(String id) {
            if (id.length() != 18)
                return false;
            //取尾数检查是不是数字或者x
            char lastChar = id.charAt(id.length() - 1);
            if( ! (lastChar >= '0' && lastChar <= '9')//最后一位不是数字
                && lastChar != 'x' //最后一位不是小写x
                && lastChar != 'X' //最后一位不是大写X
                ){
                return false;
            }
            //遍历检查前面17个是不是数字
            for (int i = 0; i < id.length() - 1; i++) {
    
                char tmp = id.charAt(i);
                if(tmp < '0' || tmp > '9'){
                    //不是数字
                    return false;
                }
            }
            return true;
        }
    
    // 计算年龄,这个代码不完整
        // 这里假定年份合法
        // 年龄 = 当前年份 - 身份证年份
        public static String getAge(String num) {
            //传进来的参数是截好的年份,不用再截了,
              //第23行截的不正确应该是6,10
            //6-10包括6不包括10,正好6,7,8,9截4位,你的代码截取字符串后面都少一个
            //String birthdayYear = getStr(num, 6, 10);
          //出生年份 
            int id_year = Integer.valueOf(num);// 强制转换
            Calendar c = Calendar.getInstance();
            //当前年份
            int currYear = c.get(Calendar.YEAR);
            int age = currYear - id_year;
    
            return age + "";//int转字符串,
        }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月9日
  • 已采纳回答 11月7日
  • 创建了问题 10月29日

悬赏问题

  • ¥15 ecplise在连接数据库时显示加载驱动成功但是数据库连接失败
  • ¥15 visionmaster启动失败,提示为“机器不满足授权而被禁用”
  • ¥50 用logisim设计16位单时钟周期cpu
  • ¥15 IDEA中圈复杂度如何具体设置
  • ¥50 labview采集不了数据
  • ¥15 Multisim红外倒车雷达仿真中距离问题
  • ¥15 请上面代码做什么处理或什么混淆
  • ¥15 英雄联盟自定义房间置顶
  • ¥15 W5500网线插上无反应
  • ¥15 如何用字典的Key,显示在WPF的xaml中