用JAVA实现--15位身份证扩展为18位身份证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用JAVA实现--15位身份证扩展为18位身份证相关的知识,希望对你有一定的参考价值。

以下是程序,用eslipse执行不对…缺个主程序?怎么写?谢谢大家啦!
package com.mmq;
public class VerifyIDCardNumber

public String getEighteenIDCard(String fifteenIDCard) throws Exception
if(fifteenIDCard != null && fifteenIDCard.length() == 15)
StringBuilder sb = new StringBuilder();
sb.append(fifteenIDCard.substring(0, 6))
.append("19")
.append(fifteenIDCard.substring(6));
sb.append(getVerifyCode(sb.toString()));
return sb.toString();
else
throw new Exception("不是15位的身份证");

public char getVerifyCode(String idCardNumber) throws Exception
if(idCardNumber == null || idCardNumber.length() < 17)
throw new Exception("不合法的身份证号码");

char[] Ai = idCardNumber.toCharArray();
int[] Wi = 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2;
char[] verifyCode = '1','0', 'X', '9', '8', '7', '6', '5', '4', '3', '2';
int S = 0;
int Y;
for(int i = 0; i < Wi.length; i++)
S += (Ai[i] - '0') * Wi[i];

Y = S % 11;
return verifyCode[Y];


public static boolean verify(String idCardNumber) throws Exception
if(idCardNumber == null || idCardNumber.length() != 18)
throw new Exception("不是18位的身份证号码");

return getVerifyCode(idCardNumber) == idCardNumber.charAt(idCardNumber.length() - 1);

再次谢谢!!

有主函数,楼主可以完全复制下来运行后,就行了,15位转成了18位

public class VerifyIDCardNumber 
StringBuilder sb;
       public static void main(String[] args) 
        VerifyIDCardNumber vv=new VerifyIDCardNumber();

public VerifyIDCardNumber()
try 
getEighteenIDCard("123456789123456");
System.out.println(sb.toString());
 catch (Exception e) 
// TODO Auto-generated catch block
e.printStackTrace();


public String getEighteenIDCard(String fifteenIDCard) throws Exception  
        if(fifteenIDCard != null && fifteenIDCard.length() == 15)  
             sb = new StringBuilder();  
            sb.append(fifteenIDCard.substring(0, 6))  
              .append("19")  
              .append(fifteenIDCard.substring(6));  
            sb.append(getVerifyCode(sb.toString()));  
            return sb.toString();  
         else   
            throw new Exception("不是15位的身份证");          
   
    public char getVerifyCode(String idCardNumber) throws Exception  
        if(idCardNumber == null || idCardNumber.length() < 17)   
            throw new Exception("不合法的身份证号码");  
          
        char[] Ai = idCardNumber.toCharArray();  
        int[] Wi = 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2;  
        char[] verifyCode = '1','0', 'X', '9', '8', '7', '6', '5', '4', '3', '2';  
        int S = 0;  
        int Y;  
        for(int i = 0; i < Wi.length; i++)  
            S += (Ai[i] - '0') * Wi[i];  
          
        Y = S % 11;  
        return verifyCode[Y];  
      
      
   public  boolean verify(String idCardNumber) throws Exception  
        if(idCardNumber == null || idCardNumber.length() != 18)   
            throw new Exception("不是18位的身份证号码");  
          
        return getVerifyCode(idCardNumber) == idCardNumber.charAt(idCardNumber.length() - 1);  
      
   

 输出结果为:12345619789123456X

参考技术A

    静态方法直接调用了非静态方法

    要么getVerifyCode()前加static

    要么verify()前的static去掉

    class VerifyIDCardNumber 

        public static void main(String[] args) 
            try 
                boolean flg = new VerifyIDCardNumber().verify("你的身份证号码");
                System.out.println(flg);
             catch (Exception e) 
                e.printStackTrace();
            
        

        public String getEighteenIDCard(String fifteenIDCard) throws Exception 
            if (fifteenIDCard != null && fifteenIDCard.length() == 15) 
                StringBuilder sb = new StringBuilder();
                sb.append(fifteenIDCard.substring(0, 6)).append("19").append(fifteenIDCard.substring(6));
                sb.append(getVerifyCode(sb.toString()));
                return sb.toString();
             else 
                throw new Exception("不是15位的身份证");
            
        

        public char getVerifyCode(String idCardNumber) throws Exception 
            if (idCardNumber == null || idCardNumber.length() < 17) 
                throw new Exception("不合法的身份证号码");
            
            char[] Ai = idCardNumber.toCharArray();
            int[] Wi =  7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ;
            char[] verifyCode =  '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' ;
            int S = 0;
            int Y;
            for (int i = 0; i < Wi.length; i++) 
                S += (Ai[i] - '0') * Wi[i];
            
            Y = S % 11;
            return verifyCode[Y];
        

        public boolean verify(String idCardNumber) throws Exception 
            if (idCardNumber == null || idCardNumber.length() != 18) 
                throw new Exception("不是18位的身份证号码");
            
            return getVerifyCode(idCardNumber) == idCardNumber.charAt(idCardNumber.length() - 1);
        

追问

运行完结果是这个??

好像不对,我输入一个15位身份证,它显示的却是这个结果

追答

调用的是verify()。你看看这个方法怎么写的?很明显,是不是18为就抛出异常

        if (idCardNumber == null || idCardNumber.length() != 18) 
            throw new Exception("不是18位的身份证号码");
        


getVerifyCode()里的:

        if (idCardNumber == null || idCardNumber.length() < 17) 
            throw new Exception("不合法的身份证号码");
        

也是长度<17就抛异常


你的代码就是判断18位的。

追问

也就是说这个程序不是把15位转换为18位,功能判断错了…

在java后台,用正则表达式验证身份证

public static boolean identity(String str)
Pattern pattern = Pattern.compile("????");
return pattern.matcher(str).matches();

上面代码,?处该怎么写

试过^\d15|\d18$ 等,都会报错,我不需要太复杂的,谢谢!

参考技术A 这个是正则表达式,给你段代码,你自己琢磨吧!

//正则表达式 校验是否存在非法字符
private String checkPattern(String str)
String len;
String regEx="[`~!@#$%^&*()+=|':;',\\[\\].<>/?~!@#¥%……&*()——+|【】‘;:”“’。,、?]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
len=m.replaceAll("").trim();
return len;
参考技术B String regx = "([0-9]17([0-9]|X))|([0-9]15)";自己写的 有的身份证最后一位是X本回答被提问者采纳 参考技术C alert(/^\d17\d1|X$/.test("11111111111111111X"));//返回true或者false 最后可以为X的验证 参考技术D ---'/^[1-9][0-9]5(19[0-9]2|200[0-9]|2010)(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[0-9]3[0-9xX]$/'

public bool isCard(string s_aStr)

Regex reg15 = new Regex(@"^[1-9]\d7((0\[1-9])|(1[0-2]))(([0\[1-9]|1\d|2\d])|3[0-1])\d2([0-9]|x|X)1$");
Regex reg18 = new Regex(@"^[1-9]\d5[1-9]\d3((0\[1-9]))|((1[0-2]))(([0\[1-9]|1\d|2\d])|3[0-1])\d3([0-9]|x|X)1$");
if (reg15.IsMatch(s_aStr) || reg18.IsMatch(s_aStr))

return true;

return false;
第5个回答  2013-08-29 ^\\d15|\\d18$追问

java.util.regex.PatternSyntaxException: Illegal repetition near index 9
^\d15|\d18$
^
at java.util.regex.Pattern.error(Pattern.java:1713)
按你说的那样写,报错了

追答

^\d15|\d18$

追问

跟我的有区别?

追答

^\\d15|\\d18$

以上是关于用JAVA实现--15位身份证扩展为18位身份证的主要内容,如果未能解决你的问题,请参考以下文章

15身份证号码转18位算法,用java 程序怎样实现即java程序源代码?

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

用JAVA编写一个对18位身份证的输入验证程序.要求输入的18位数字或最后一位为x时,通过验证,否则不通过.

java身份证号位数校验

Java笔试题之《算法与编程》