网站链接: 我爱捣鼓
当前位置: 首页 > web开发  > Asp.net/C#

java验证身份证号码是否有效的类和方法

2021/10/20 21:20:45

程序里经常需要用户输入身份证号码和姓名,用户输入的身份证号码是否有效,这就需要我们使用算法去校验了,今天我们就来说说java验证身份证号码是否有效的类和方法package com.nebula; import java.text.SimpleDateFormat; import java.util.Date; public class C…

        程序里经常需要用户输入身份证号码和姓名,用户输入的身份证号码是否有效,这就需要我们使用算法去校验了,今天我们就来说说java验证身份证号码是否有效的类和方法

package com.nebula;  
  
import java.text.SimpleDateFormat;  
import java.util.Date;  
  
public class CheckIdCard {  
  
      
    public static final String ACCEPT = ""; // 检查通过是返回的的成功标识字符串  
      
    public static final int EIGHTEEN_IDCARD = 18;   //标识18位身份证号码  
    public static final int FIFTEEN_IDCARD = 15;    //标识15位身份证号码  
      
    public static final int MAX_MAINLAND_AREACODE = 659004; //大陆地区地域编码最大值  
    public static final int MIN_MAINLAND_AREACODE = 110000; //大陆地区地域编码最小值  
    public static final int HONGKONG_AREACODE = 810000; //香港地域编码值  
    public static final int TAIWAN_AREACODE = 710000;   //台湾地域编码值  
    public static final int MACAO_AREACODE = 820000;    //澳门地域编码值  
      
    private static final int MAN_SEX = 1;   //标识男性  
    private static final int WOMAN_SEX = 2; //标识女性  
      
    //储存18位身份证校验码  
    private static final String[] SORTCODES = new String[]{"1","0","X","9","8","7","6","5","4","3","2"};  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        String idCard = "142424870329324";  
        String result = chekIdCard(1,idCard);  
        if( "".equals(result) )  
            System.out.println("身份证合法");  
        else   
            System.out.println(result);  
    }  
      
      
    /** 
     * 验证身份证主方法 
     */  
    public static String chekIdCard( int sex,String idCardInput ){  
        if( idCardInput == null || "".equals(idCardInput))  
            return "身份证号码为必填";  
        if( idCardInput.length() != 18 && idCardInput.length() !=15 )  
            return "身份证号码位数不符";  
        if( idCardInput.length() == 15)  
            return checkIdCard15(sex,idCardInput);  
        else  
            return checkIdCard18(sex,idCardInput);  
    }  
      
    /** 
     * 验证15位身份证号码 
     */  
    private static String checkIdCard15( int sex,String idCardInput ){  
        String numberResult = checkNumber(FIFTEEN_IDCARD,idCardInput);  
        if( !ACCEPT.equals(numberResult))  
            return numberResult;  
          
        String areaResult = checkArea(idCardInput);  
        if( !ACCEPT.equals(areaResult))  
            return areaResult;  
          
        String birthResult = checkBirthDate( FIFTEEN_IDCARD, idCardInput);  
        if( !ACCEPT.equals(birthResult))  
            return birthResult;  
          
        String sortCodeResult = checkSortCode(FIFTEEN_IDCARD,sex,idCardInput);  
        if( !ACCEPT.equals(sortCodeResult))  
            return sortCodeResult;  
          
        String checkCodeResult = checkCheckCode(FIFTEEN_IDCARD,idCardInput);  
        if( !ACCEPT.equals(checkCodeResult))  
            return checkCodeResult;  
          
        return ACCEPT;  
    }  
      
    /** 
     * 验证18位身份证号码 
     */  
    private static String checkIdCard18( int sex, String idCardInput ){  
          
        String numberResult = checkNumber(EIGHTEEN_IDCARD,idCardInput);  
        if( !ACCEPT.equals(numberResult))  
            return numberResult;  
          
        String areaResult = checkArea(idCardInput);  
        if( !ACCEPT.equals(areaResult))  
            return areaResult;  
          
        String birthResult = checkBirthDate( EIGHTEEN_IDCARD, idCardInput);  
        if( !ACCEPT.equals(birthResult))  
            return birthResult;  
  
        String sortCodeResult = checkSortCode(EIGHTEEN_IDCARD,sex,idCardInput);  
        if( !ACCEPT.equals(sortCodeResult))  
            return sortCodeResult;  
          
        String checkCodeResult = checkCheckCode(EIGHTEEN_IDCARD,idCardInput);  
        if( !ACCEPT.equals(checkCodeResult))  
            return checkCodeResult;  
          
        return ACCEPT;  
    }  
      
    /** 
     * 验证身份证的地域编码是符合规则 
     */  
    private static String checkArea( String idCardInput ){  
        String subStr = idCardInput.substring(0, 6);  
        int areaCode = Integer.parseInt(subStr);  
        if( areaCode != HONGKONG_AREACODE && areaCode != TAIWAN_AREACODE  
                && areaCode != MACAO_AREACODE   
                && ( areaCode > MAX_MAINLAND_AREACODE || areaCode < MIN_MAINLAND_AREACODE) )  
            return "输入的身份证号码地域编码不符合大陆和港澳台规则";  
        return ACCEPT;  
    }  
      
    /** 
     * 验证身份证号码数字字母组成是否符合规则 
     */  
    private static String checkNumber( int idCardType ,String idCard ){  
        char[] chars = idCard.toCharArray();  
        if( idCardType == FIFTEEN_IDCARD ){  
            for( int i = 0; i<chars.length;i++){  
                if( chars[i] > '9' )  
                    return idCardType+"位身份证号码中不能出现字母";  
            }  
        } else {  
            for( int i = 0; i < chars.length; i++ ) {  
                if( i < chars.length-1 ){  
                    if( chars[i] > '9' )  
                        return EIGHTEEN_IDCARD+"位身份证号码中前"+(EIGHTEEN_IDCARD-1)+"不能出现字母";  
                } else {  
                    if( chars[i] > '9' && chars[i] != 'X')  
                        return idCardType+"位身份证号码中最后一位只能是数字0~9或字母X";  
                }  
            }  
              
        }  
              
        return ACCEPT;  
    }  
      
    /** 
     * 验证身份证号码出生日期是否符合规则 
     */  
    private static String checkBirthDate(int idCardType, String idCardInput ){  
        String yearResult = checkBirthYear(idCardType,idCardInput);  
        if( !ACCEPT.equals(yearResult))  
            return yearResult;  
          
        String monthResult = checkBirthMonth(idCardType,idCardInput);  
        if( !ACCEPT.equals(monthResult))  
            return monthResult;  
          
        String dayResult = checkBirthDay(idCardType,idCardInput);  
        if( !ACCEPT.equals(dayResult))  
            return dayResult;  
  
        return ACCEPT;  
    }  
      
    /** 
     * 验证身份证号码出生日期年份是否符合规则 
     */  
    private static String checkBirthYear(int idCardType, String idCardInput){  
        if( idCardType == FIFTEEN_IDCARD){  
            int year = Integer.parseInt(idCardInput.substring(6, 8));  
            if( year < 0 || year > 99 )  
                return idCardType+"位的身份证号码年份须在00~99内";  
        } else {  
            int year = Integer.parseInt(idCardInput.substring(6, 10));  
            int yearNow = getYear();  
            if( year < 1900 || year > yearNow )  
                return idCardType+"位的身份证号码年份须在1900~"+yearNow+"内";  
        }  
        return ACCEPT;  
    }  
  
    /** 
     * 验证身份证号码出生日期月份是否符合规则 
     */  
    private static String checkBirthMonth(int idCardType, String idCardInput){  
        int month = 0;  
        if( idCardType == FIFTEEN_IDCARD)  
            month = Integer.parseInt(idCardInput.substring(8, 10));   
        else   
            month = Integer.parseInt(idCardInput.substring(10, 12));  
          
        if( month < 1 || month > 12)  
            return "身份证号码月份须在01~12内";  
              
        return ACCEPT;  
    }  
      
    /** 
     * 验证身份证号码出生日期天数是否符合规则 
     */  
    private static String checkBirthDay(int idCardType, String idCardInput){  
        boolean bissextile = false;   
        int year,month,day;  
        if( idCardType == FIFTEEN_IDCARD){  
            year = Integer.parseInt("19"+idCardInput.substring(6, 8));  
            month = Integer.parseInt(idCardInput.substring(8, 10));   
            day = Integer.parseInt(idCardInput.substring(10, 12));  
        } else {  
            year = Integer.parseInt(idCardInput.substring(6, 10));  
            month = Integer.parseInt(idCardInput.substring(10, 12));  
            day = Integer.parseInt(idCardInput.substring(12, 14));  
        }  
        if( year%4 == 0 && year%100 != 0 || year%400 ==0 )    
            bissextile = true;  
          
        switch( month ){  
        case 1:  
        case 3:  
        case 5:  
        case 7:  
        case 8:  
        case 10:  
        case 12:  
            if( day < 1 || day > 31 )  
                return "身份证号码大月日期须在1~31之间";  
                break;  
        case 4:  
        case 6:  
        case 9:  
        case 11:  
            if( day < 1 || day > 30 )  
                return "身份证号码小月日期须在1~30之间";  
                break;  
        case 2:  
            if(bissextile){  
                if( day < 1 || day > 29 )  
                    return "身份证号码闰年2月日期须在1~29之间";  
            }else {  
                if( day < 1 || day > 28 )  
                    return "身份证号码非闰年2月日期年份须在1~28之间";  
            }  
            break;  
        }  
        return ACCEPT;  
    }  
      
    /** 
     * 验证身份证号码顺序码是否符合规则,男性为偶数,女性为奇数 
     */  
    private static String checkSortCode(int idCardType ,int sex,String idCardInput){  
        int sortCode = 0;  
        if( idCardType == FIFTEEN_IDCARD ){  
            sortCode = Integer.parseInt(idCardInput.substring(12, 15));  
        } else {  
            sortCode = Integer.parseInt(idCardInput.substring(14, 17));  
        }  
          
        if( sex == MAN_SEX ){  
            if( sortCode%2 == 0)  
                return "男性的身份证顺序码须为奇数";  
        } else {  
            if( sortCode%2 != 0)  
                return "女性的身份证顺序码须为偶数";       
        }  
          
        return ACCEPT;  
    }  
      
    /** 
     * 验证18位身份证号码校验码是否符合规则 
     */  
    private static String checkCheckCode( int idCardType , String idCard ){  
        if( idCardType == EIGHTEEN_IDCARD ){  
            int sum = 0;  
            char[] chars = idCard.toCharArray();  
            for( int i=0; i<chars.length; i++ ){  
                if( i==0 ) sum = sum+(chars[i]*7);  
                if( i==1 ) sum = sum+(chars[i]*9);  
                if( i==2 ) sum = sum+(chars[i]*10);  
                if( i==3 ) sum = sum+(chars[i]*5);  
                if( i==4 ) sum = sum+(chars[i]*5);  
                if( i==5 ) sum = sum+(chars[i]*8);  
                if( i==6 ) sum = sum+(chars[i]*4);  
                if( i==7 ) sum = sum+(chars[i]*1);  
                if( i==8 ) sum = sum+(chars[i]*6);  
                if( i==9 ) sum = sum+(chars[i]*3);  
                if( i==10 ) sum = sum+(chars[i]*7);  
                if( i==11 ) sum = sum+(chars[i]*9);  
                if( i==12 ) sum = sum+(chars[i]*10);  
                if( i==13 ) sum = sum+(chars[i]*5);  
                if( i==14 ) sum = sum+(chars[i]*8);  
                if( i==15 ) sum = sum+(chars[i]*4);  
                if( i==16 ) sum = sum+(chars[i]*2);  
            }  
              
            int checkCode = sum%11;  
            String sortCode = SORTCODES[checkCode];  
              
            if(!sortCode.equals(String.valueOf(chars[chars.length-1])))  
                return "身份中的校验码不正确";  
        }  
        return ACCEPT;  
    }  
      
    /** 
     * 返回当前年份 
     */  
    private static int getYear(){  
        Date now = new Date();  
        SimpleDateFormat format = new SimpleDateFormat("yyyymmdd");   
        String nowStr = format.format(now);  
        return Integer.parseInt(nowStr.substring(0, 4));  
    }  
}

        通过以上内容我们知道了java验证身份证号码是否有效的类和方法,感谢您访问“我爱捣鼓(www.woaidaogu.com)”网站的内容,希望对大家有所帮助!引用本文内容时,请注明出处!谢谢合作!

相关资讯

  • Visual Studio2010代码块区域折叠起来的快捷键CTRL+K+S

    加#region和#endregion的作用主要是 :可以将这块区域的代码折叠起来,便于查看。 快捷键 CTRL + K + S,选第二个。也可以点击鼠标右键选择‘外侧代码’找到它。 必须是成对出现。就像是一对括号。只是不会被编译。 通过以上内容我们知道了Visual S…

    2021/10/18 21:46:33
  • C#如何判断两个时间的大小?

    C#如何判断两个时间的大小? 其实很简单,我们可以通过C#的一个方法就能解决,下面我们就来说说这个方法。 C# 时间比较方法DateTime.Compare public static int Compare(DateTime t1,DateTime t2) 返回值类型:System.Int32 当结果<0时表…

    2021/10/15 21:42:07
  • 如果房东的猫知道这个她就不会再问今天是星期几了!

    房东的猫如果会敲代码,写个这么简单的小程序她就不会成天喊叫"今天是星期几"了。 /// <summary> /// 获得今天星期几的函数 /// </summary> /// <returns></returns> public string GetDayOfWeek(…

    2021/10/15 21:38:13
  • C#使用身份证号码判断用户是否未成年

    C#如何使用身份证号码来判断用户是否未成年,今天我们就来看看这个C#方法怎么写。 /// <summary> /// 使用身份证号码判断用户是否未成年 /// </summary> /// <param name="num"></param> /// <…

    2021/10/15 21:32:45