1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
| import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.regex.Matcher; import java.util.regex.Pattern;
public class Test { public static String IDCardValidate(String IDStr) throws ParseException { IDStr = IDStr.toLowerCase(); String errorInfo = ""; String[] ValCodeArr = { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" }; String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2" }; String Ai = ""; if ((IDStr.length() != 15) && (IDStr.length() != 18)) { errorInfo = "身份证号码长度应为15位或18位。"; return errorInfo; } if (IDStr.length() == 18) Ai = IDStr.substring(0, 17); else if (IDStr.length() == 15) { Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15); } if (!isNumeric(Ai)) { errorInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。"; return errorInfo; } String strYear = Ai.substring(6, 10); String strMonth = Ai.substring(10, 12); String strDay = Ai.substring(12, 14); if (!isDate(strYear + "-" + strMonth + "-" + strDay)) { errorInfo = "身份证生日无效。"; return errorInfo; } GregorianCalendar gc = new GregorianCalendar(); SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd"); if ((gc.get(1) - Integer.parseInt(strYear) > 150) || (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay) .getTime() < 0L)) { errorInfo = "身份证生日不在有效范围。"; return errorInfo; } if ((Integer.parseInt(strMonth) > 12) || (Integer.parseInt(strMonth) == 0)) { errorInfo = "身份证月份无效"; return errorInfo; } if ((Integer.parseInt(strDay) > 31) || (Integer.parseInt(strDay) == 0)) { errorInfo = "身份证日期无效"; return errorInfo; } Hashtable<String, String> h = GetAreaCode(); if (h.get(Ai.substring(0, 2)) == null) { errorInfo = "身份证地区编码错误。"; return errorInfo; } int TotalmulAiWi = 0; for (int i = 0; i < 17; i++) { TotalmulAiWi = TotalmulAiWi + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]); } int modValue = TotalmulAiWi % 11; String strVerifyCode = ValCodeArr[modValue]; Ai = Ai + strVerifyCode; if (IDStr.length() == 18) { if (!Ai.equals(IDStr)) { errorInfo = "身份证无效,不是合法的身份证号码"; return errorInfo; } } else return ""; return ""; } private static Hashtable<String, String> GetAreaCode() { Hashtable<String, String> hashtable = new Hashtable<String, String>(); hashtable.put("11", "北京"); hashtable.put("12", "天津"); hashtable.put("13", "河北"); hashtable.put("14", "山西"); hashtable.put("15", "内蒙古"); hashtable.put("21", "辽宁"); hashtable.put("22", "吉林"); hashtable.put("23", "黑龙江"); hashtable.put("31", "上海"); hashtable.put("32", "江苏"); hashtable.put("33", "浙江"); hashtable.put("34", "安徽"); hashtable.put("35", "福建"); hashtable.put("36", "江西"); hashtable.put("37", "山东"); hashtable.put("41", "河南"); hashtable.put("42", "湖北"); hashtable.put("43", "湖南"); hashtable.put("44", "广东"); hashtable.put("45", "广西"); hashtable.put("46", "海南"); hashtable.put("50", "重庆"); hashtable.put("51", "四川"); hashtable.put("52", "贵州"); hashtable.put("53", "云南"); hashtable.put("54", "西藏"); hashtable.put("61", "陕西"); hashtable.put("62", "甘肃"); hashtable.put("63", "青海"); hashtable.put("64", "宁夏"); hashtable.put("65", "新疆"); hashtable.put("71", "台湾"); hashtable.put("81", "香港"); hashtable.put("82", "澳门"); hashtable.put("91", "国外"); return hashtable; } private static boolean isNumeric(String str) { Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(str); return isNum.matches(); } public static boolean isDate(String strDate) { Pattern pattern = Pattern .compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$"); Matcher m = pattern.matcher(strDate); return m.matches(); } public static void main(String[] args) { try { String str = IDCardValidate("110101199201016737"); System.out.println(str); } catch (ParseException e) { e.printStackTrace(); } } }
|