身份证15位升18位++身份证验证


    def test1(){
        //身份证件号验证++身份证号升位
        def sql = new Sql(dataSource)
        String sfz = "SELECT id,sfzjh FROM jzgjbsj"
        def  sfzh = sql.rows(sfz)
        def i = 0
        while (i<sfzh.size()){
            def tests = sfzh[i].sfzjh
            def  tesa = tests.toString()          
            if (tesa.size()==15){
                StringBuffer sb = new  StringBuffer()
                sb.append(tesa.substring(0,6))
                .append("19")
                .append(tesa.substring(6))
                String csb = sb.toString()
                def zzz = getVerifyCode(csb)
                sb.append(zzz)
               println "升为后的身份证号:"+sb
            }
            if (tesa.size()==18) {
                def ereg
//平润 判断
                if (Integer.parseInt(tesa.substring(6, 10)) % 4 == 0 || (Integer.parseInt(tesa.substring(6, 10)) % 100 == 0 && Integer.parseInt(tesa.substring(6, 10)) % 4 == 0)) {
                    ereg = /[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]/
                    //闰年出生日期的合法性正则表达式 适用19XX
                } else {
                    ereg = /[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]/
                    //平年出生日期的合法性正则表达式 适用19XX
                }
//正则表达式的一种比较方式 ==~    匹配操作符 (==~) 查找操作符 (=~) 模式操作符 (~string)
                def math = tesa ==~ ereg
                if (math) {
                    // 1.将身份证号码前面的17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
                    int[] intArr = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
                    def sum = 0;
                    def z
                    for (z = 0; z < intArr.size(); z++) {
                        // 2.将这17位数字和系数相乘的结果相加。
                        sum += Character.digit(tesa.charAt(z), 10) * intArr[z];
                    }
                    // 3.用加出来和除以11,看余数是多少?
                    int mod = sum % 11;
                    // 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
int[] intArr3 = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
                    String matchDigit = "";
                    for (z = 0; z < 11; z++) {
                        int j = z;
                        if (j == mod) {
                            matchDigit = String.valueOf(intArr3[z]);
                            if (intArr3[z] > 57) {
                                matchDigit = String.valueOf((char) intArr3[z]);
                            }
                        }
                    }
//与18位身份证 的验证码比较
                    if (matchDigit.equals(tesa.substring(tesa.length() - 1))) {

                    } else {
                        StringBuilder stringBuilder = new StringBuilder(tesa)
//有新的验证码替换原来的验证码
                        stringBuilder.replace(tesa.length() - 1, tesa.length(), matchDigit)
                        def upda = stringBuilder.toString()
println("ID Card Verify Faild!" + tesa + "=======" + matchDigit + "-----更改后的:" + upda)
                    }
                } else {
                    println math.toString() + "====" + tesa
                }
            }
            i++
        }
    }
def getVerifyCode(String sb){
        char[] code = ['1','0','X','9','8','7','6','5','4','3','2'];  //11个
        int[] intArr2 = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]//17个
        int     z;
        int     sum;
        int     remainder;
        sum = 0;
        for (z=0; z<intArr2.size(); z++)
        {
            sum += Character.digit(sb.charAt(z), 10) * intArr2[z];
        }
        remainder = sum%11;
        String lastCheckBit = String.valueOf(code[ remainder ]);    
        return sb + lastCheckBit;
    }

猜你喜欢

转载自zjyads.iteye.com/blog/2331551