18位身份证的校验

今天需要这样的一个判断,于是自己试着写了一下:(其实主要就是判断最后一位)

package demo.test2;

import java.util.HashMap;
import java.util.Map;

/**
 * 
 * @author yinbenyang
 *18位身份证的验证
 */
public class java_7 {

    public static void main(String[] args) {
        String myCard = "111111190001019999";
        boolean flag = checkIdCard(myCard);
        System.out.println("flag:"+flag);        
    }
    
    public final static Map<Integer, Character> map = new HashMap<Integer, Character>();
    static{
        map.put(0, '1');
        map.put(1, '0');
        map.put(2, 'X');
        map.put(3, '9');
        map.put(4, '8');
        map.put(5, '7');
        map.put(6, '6');
        map.put(7, '5');
        map.put(8, '4');
        map.put(9, '3');
        map.put(10, '2');
    }
    
    public static boolean checkIdCard(String IdCard) {
        if(IdCard==null||IdCard.length()!=18){
            return false;
        }
        int wi[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        int sum = 0;
        for(int i = 0 ; i<wi.length ; i++){
            sum+= wi[i]*(Integer.parseInt(""+IdCard.charAt(i)));
        }
        return map.get(sum%11)==IdCard.charAt(17);
    }
    
}

 javascript版本:

function isIdCardNo(num) 
{
    try{
        var factorArr = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
        var error;
        var varArray = new Array();
        var intValue;
        var lngProduct = 0;
        var intCheckDigit;
        var intStrLen = num.length;
        var idNumber = num;    
        // initialize
        if ((intStrLen != 15) && (intStrLen != 18)) {
            //error = "输入身份证号码长度不对!";
            //alert(error);
            //frmAddUser.txtIDCard.focus();
            return false;
        }    
        // check and set value
        for(i=0;i<intStrLen;i++) {
            varArray[i] = idNumber.charAt(i);
            if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) {
                //error = "错误的身份证号码!.";
                //alert(error);
                //frmAddUser.txtIDCard.focus();
                return false;
            } else if (i < 17) {
                varArray[i] = varArray[i]*factorArr[i];
            }
        }
        if (intStrLen == 18) {
            //check date
            var date8 = idNumber.substring(6,14);
            if (checkDate(date8) == false) {
                //error = "身份证中日期信息不正确!.";
                //alert(error);
                return false;
            }        
            // calculate the sum of the products
            for(i=0;i<17;i++) {
                lngProduct = lngProduct + varArray[i];
            }        
            // calculate the check digit
            intCheckDigit = 12 - lngProduct % 11;
            switch (intCheckDigit) {
                case 10:
                    intCheckDigit = 'X';
                    break;
                case 11:
                    intCheckDigit = 0;
                    break;
                case 12:
                    intCheckDigit = 1;
                    break;
            }        
            // check last digit
            if (varArray[17].toUpperCase() != intCheckDigit) {
                //error = "身份证效验位错误!...正确为: " + intCheckDigit + ".";
                //alert(error);
                return false;
            }
        } 
        else{        //length is 15
            //check date
            var date6 = idNumber.substring(6,12);
            if (checkDate(date6) == false) {
                //alert("身份证日期信息有误!.");
                return false;
            }
        }
    }catch(e){
        //alert(e)
    }
    
    //alert ("Correct.");
    return true;
}
原文地址:https://www.cnblogs.com/yby-blogs/p/4063509.html