身份证号码转换程序

        昨天帮同学编了一个小程序,主要是为了完成把身份证号码由15位转换成18位。原来在使用substring函数时总是一带而过,现在遇到麻烦了,归根到底是没仔细看过原文API,现在罗列出来,复习一下!源程序如下:
class IDConvert
{       public static void main(String [] args)
        {
                   String T="";                                                              //18位号码的尾数,由后面计算得出最后取值
                   long R;                                                                     //文章最后有全面的说明
                  String Final_Id_Num;
                  String Id;
                  Id = "120103311222265";
                  long N = 0;
                 String strTailChars = "10x98765432";
       try
      {
             long IdNum = Long.parseLong(Id);
             if (Id.length()!=15)
             throw new Exception();        
      }
      catch(IllegalArgumentException e)
      {
      System.out.println("输入的不是正确参数");
      }
      catch(Exception e1)
      {
      System.out.println("输入的号码位数不正确");
      
      }
     String Id_6_Upper = Id.substring(0,6);                                     //要在原15位号码中加上“19”,拆成两部分
     String Id_9_Lower = Id.substring(6,15);
     String Original_New_Id = Id_6_Upper + "19" + Id_9_Lower;  //变成17位号码
     int v_List[]={2,4,8,5,10,9,7,3,6,1,2,4,8,5,10,9,7};                   //计算尾数的一个数组
        int i,m,repeat=0;
        for(i=0;i<17;i++)
        {
           m=16-repeat;
           //System.out.println(repeat);
           N+= Long.parseLong(Original_New_Id.substring(m,m+1))*(long)v_List[repeat];           //见文尾说明
           //System.out.println(N);
           repeat++;
         }
        R = N%11;                                                  //取模找对应的T值(18位的尾数)
        System.out.println(R);
        for(m=0;m<11;m++)
        {
             if(R==m)
              T = strTailChars.substring(m,m+1);
            
        }
        System.out.println(T);
        Final_Id_Num = Original_New_Id +T;                            //17位的号码+尾数T
        System.out.println(Final_Id_Num);
    }
}

程序的要求及转换规则如下:

身份证号转换由15位到18位.(输入的参数是命令行参数,输出18位身份证号)
错误处理:
a.用户输入的身份证号必须是15位,如果输入有误要给出提示。
b.如果用户输入了非数字字符,给出提示信息。
提示:当字符串转换成数字的函数发生异常,则说明输入了非数字字符。
计算18为身份证号:
身份号15位到18位转换算法:
1.身份证号转换由15位到18位.(输入的参数是命令行参数)
错误处理:
a.用户输入的身份证号必须是15位,如果输入有误要给出提示。
b.如果用户输入了非数字字符,给出提示信息。
提示:当字符串转换成数字的函数发生异常,则说明输入了非数字字符。
1.在6位行政区后插入2位世纪代码(如19),构成四位出生年份,得到17位号码;
2.把17位号码从高位到低位与下列17个数字分别相乘求和(N):
提示: int v_List[]={2,4,8,5,10,9,7,3,6,1,2,4,8,5,10,9,7};
比如:身份证号为:c1c2c3c4......c16c17
则 N=c17x2+c16x4+......+c1x7;
3.将N除以11取余数R,根据余数计算尾数T:
1)如果R=0,则T=1;如果R=2,则T=X;
2)如果R=3,则T=9;......
提示:String strTailChars="10x98765432";
4.将尾数T添加到17位号码后即得到18位号码。


另substring()的应用如下:
        在括号中如果只有一个参数,代表 返回值为该 字符串对象中与参数对应的位置那个字符至尾字符的字符串。
        exp:  String aa = ''qwerty'';
                aa.substring(2)的返回值为:''erty''

        如果有两个参数,可以这样理解:第一个参数为在 原字符串中与参数相对应的位置的那个字符,第二个参数就是从原字符串中,由第一个字符算起一共有几个字符,返回值即为两个参数对应字符之间的那段字符串
        exp: String aa = ''qwertyuiop''
               aa.substring(2,8)的返回值为:''ertyui''
        

写完这些,连自己都有点晕,希望以后就算能记住了,汗……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Sure, 我可以帮你解决这个问题。身份证号码校验程序的实现可以通过以下步骤完成: 1. 在Java中创建一个新的类,使用Scanner类获取用户输入的身份证号码。 2. 创建一个方法,该方法将输入的身份证号码作为参数,并将其转换为char[]数组。 3. 对转换后的数组进行一些简单的验证,例如检查长度是否为18个字符以及前17个字符是否都是数字。 4. 使用第17个和第18个字符计算身份证号码的校验和。 5. 将ComputeCheckSum方法引用到ValidateID方法中,以计算并验证身份证号码的校验和。 6. 加入对地区代码和出生日期的验证。 以下是身份证号码校验程序的示例代码: ``` import java.util.Scanner; public class ValidateID { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Please enter your ID number: "); String id = scanner.next(); if (ValidateID(id)) { System.out.println("Valid ID number"); } else { System.out.println("Invalid ID number"); } } public static boolean ValidateID(String id) { if (id == null || id.trim().length() != 18) { return false; } char[] ids = id.toCharArray(); for (int i = 0; i < ids.length - 1; i++) { if (!Character.isDigit(ids[i])) { return false; } } String[] wf = new String[]{"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"}; String[] vcode = new String[]{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; int sum = 0; for (int i = 0; i < wf.length; i++) { sum += Integer.parseInt(wf[i]) * Integer.parseInt(String.valueOf(ids[i])); } int mod = sum % 11; String last = String.valueOf(ids[17]); if (mod == 2) { if (!last.equalsIgnoreCase("x")) { return false; } } else { if (!last.equals(vcode[mod])) { return false; } } String areaCode = id.substring(0, 6); String year = id.substring(6, 10); String month = id.substring(10, 12); String day = id.substring(12, 14); String birthday = year + "-" + month + "-" + day; boolean yearCheck = Integer.valueOf(year) >= 1900 && Integer.valueOf(year) <= (Calendar.getInstance().get(Calendar.YEAR) - 18); try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); format.setLenient(false); format.parse(birthday); } catch (Exception e) { return false; } boolean areaCheck = false; for (String area : areaCodeArray) { if (area.equals(areaCode.substring(0, 2))) { areaCheck = true; break; } } return yearCheck && areaCheck; } } ``` 请注意,我并不是储存已经输入的文本,所以我将无法记住之前提到的文本。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值