校验身份证号码(转载)

  1 public class IDCardVerify {
  2
  3     private String errorInfo;
  4
  5     // wi =2(n-1)(mod 11)
  6     final int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };
  7     // verify digit
  8     final int[] vi = { 1, 0, ‘X‘, 9, 8, 7, 6, 5, 4, 3, 2 };
  9     private int[] ai = new int[18];
 10     private static String[] _areaCode = { "11", "12", "13", "14", "15", "21",
 11             "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42",
 12             "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62",
 13             "63", "64", "65", "71", "81", "82", "91" };
 14     private static HashMap<String, Integer> dateMap;
 15     private static HashMap<String, String> areaCodeMap;
 16     static {
 17         dateMap = new HashMap<String, Integer>();
 18         dateMap.put("01", 31);
 19         dateMap.put("02", null);
 20         dateMap.put("03", 31);
 21         dateMap.put("04", 30);
 22         dateMap.put("05", 31);
 23         dateMap.put("06", 30);
 24         dateMap.put("07", 31);
 25         dateMap.put("08", 31);
 26         dateMap.put("09", 30);
 27         dateMap.put("10", 31);
 28         dateMap.put("11", 30);
 29         dateMap.put("12", 31);
 30         areaCodeMap = new HashMap<String, String>();
 31         for (String code : _areaCode) {
 32             areaCodeMap.put(code, null);
 33         }
 34     }
 35
 36     // 验证身份证位数,15位和18位身份证
 37     public boolean verifyLength(String code) {
 38         int length = code.length();
 39         if (length == 15 || length == 18) {
 40             return true;
 41         } else {
 42             errorInfo = "错误:输入的身份证号不是15位和18位的";
 43             return false;
 44         }
 45     }
 46
 47     // 判断地区码
 48     public boolean verifyAreaCode(String code) {
 49         String areaCode = code.substring(0, 2);
 50         // Element child= _areaCodeElement.getChild("_"+areaCode);
 51         if (areaCodeMap.containsKey(areaCode)) {
 52             return true;
 53         } else {
 54             errorInfo = "错误:输入的身份证号的地区码(1-2位)[" + areaCode
 55                     + "]不符合中国行政区划分代码规定(GB/T2260-1999)";
 56             Log.e("---------", errorInfo);
 57             return false;
 58         }
 59     }
 60
 61     // 判断月份和日期
 62     public boolean verifyBirthdayCode(String code) {
 63         // 验证月份
 64         String month = code.substring(10, 12);
 65         boolean isEighteenCode = (18 == code.length());
 66         if (!dateMap.containsKey(month)) {
 67             errorInfo = "错误:输入的身份证号"
 68                     + (isEighteenCode ? "(11-12位)" : "(9-10位)") + "不存在["
 69                     + month + "]月份,不符合要求(GB/T7408)";
 70             return false;
 71         }
 72         // 验证日期
 73         String dayCode = code.substring(12, 14);
 74         Integer day = dateMap.get(month);
 75         String yearCode = code.substring(6, 10);
 76         Integer year = Integer.valueOf(yearCode);
 77         String currentTime = StringUtil.formateDateToDay(System
 78                 .currentTimeMillis());
 79         Integer currentYear = Integer.valueOf(currentTime.substring(0, 4));
 80         int age = currentYear - year;
 81         // Log.e("----------", currentTime+";"+currentYear+";"+age+"");
 82         if (age <= 16 || age >= 115) {
 83             return false;
 84         }
 85         // 非2月的情况
 86         if (day != null) {
 87             if (Integer.valueOf(dayCode) > day || Integer.valueOf(dayCode) < 1) {
 88                 errorInfo = "错误:输入的身份证号"
 89                         + (isEighteenCode ? "(13-14位)" : "(11-13位)") + "["
 90                         + dayCode + "]号不符合小月1-30天大月1-31天的规定(GB/T7408)";
 91                 return false;
 92             }
 93         }
 94         // 2月的情况
 95         else {
 96             // 闰月的情况
 97             if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
 98                 if (Integer.valueOf(dayCode) > 29
 99                         || Integer.valueOf(dayCode) < 1) {
100                     errorInfo = "错误:输入的身份证号"
101                             + (isEighteenCode ? "(13-14位)" : "(11-13位)") + "["
102                             + dayCode + "]号在" + year
103                             + "闰年的情况下未符合1-29号的规定(GB/T7408)";
104                     return false;
105                 }
106             }
107             // 非闰月的情况
108             else {
109                 if (Integer.valueOf(dayCode) > 28
110                         || Integer.valueOf(dayCode) < 1) {
111                     errorInfo = "错误:输入的身份证号"
112                             + (isEighteenCode ? "(13-14位)" : "(11-13位)") + "["
113                             + dayCode + "]号在" + year
114                             + "平年的情况下未符合1-28号的规定(GB/T7408)";
115                     return false;
116                 }
117             }
118         }
119         return true;
120     }
121
122     // 验证身份除了最后位其他的是否包含字母
123     public boolean containsAllNumber(String code) {
124         String str = "";
125         if (code.length() == 15) {
126             str = code.substring(0, 15);
127         } else if (code.length() == 18) {
128             str = code.substring(0, 17);
129         }
130         char[] ch = str.toCharArray();
131         for (int i = 0; i < ch.length; i++) {
132             if (!(ch[i] >= ‘0‘ && ch[i] <= ‘9‘)) {
133                 errorInfo = "错误:输入的身份证号第" + (i + 1) + "位包含字母";
134                 return false;
135             }
136         }
137         return true;
138     }
139
140     public String getCodeError() {
141         return errorInfo;
142     }
143
144     // 验证身份证
145     public boolean verify(String idcard) {
146         errorInfo = "";
147         // 验证身份证位数,15位和18位身份证
148         if (!verifyLength(idcard)) {
149             return false;
150         }
151         // 验证身份除了最后位其他的是否包含字母
152         if (!containsAllNumber(idcard)) {
153             return false;
154         }
155
156         // 如果是15位的就转成18位的身份证
157         String eifhteencard = "";
158         if (idcard.length() == 15) {
159             eifhteencard = uptoeighteen(idcard);
160         } else {
161             eifhteencard = idcard;
162         }
163         // 验证身份证的地区码
164         if (!verifyAreaCode(eifhteencard)) {
165             return false;
166         }
167         // 判断月份和日期
168         if (!verifyBirthdayCode(eifhteencard)) {
169             return false;
170         }
171         // 验证18位校验码,校验码采用ISO 7064:1983,MOD 11-2 校验码系统
172         if (!verifyMOD(eifhteencard)) {
173             return false;
174         }
175         return true;
176     }
177
178     // 验证18位校验码,校验码采用ISO 7064:1983,MOD 11-2 校验码系统
179     public boolean verifyMOD(String code) {
180         String verify = code.substring(17, 18);
181         if ("x".equals(verify)) {
182             code = code.replaceAll("x", "X");
183             verify = "X";
184         }
185         String verifyIndex = getVerify(code);
186         if (verify.equals(verifyIndex)) {
187             return true;
188         }
189         // int x=17;
190         // if(code.length()==15){
191         // x=14;
192         // }
193         errorInfo = "错误:输入的身份证号最末尾的数字验证码错误";
194         return false;
195     }
196
197     // 获得校验位
198     public String getVerify(String eightcardid) {
199         int remaining = 0;
200
201         if (eightcardid.length() == 18) {
202             eightcardid = eightcardid.substring(0, 17);
203         }
204
205         if (eightcardid.length() == 17) {
206             int sum = 0;
207             for (int i = 0; i < 17; i++) {
208                 String k = eightcardid.substring(i, i + 1);
209                 ai[i] = Integer.parseInt(k);
210             }
211
212             for (int i = 0; i < 17; i++) {
213                 sum = sum + wi[i] * ai[i];
214             }
215             remaining = sum % 11;
216         }
217
218         return remaining == 2 ? "X" : String.valueOf(vi[remaining]);
219     }
220
221     // 15位转18位身份证
222     public String uptoeighteen(String fifteencardid) {
223         String eightcardid = fifteencardid.substring(0, 6);
224         eightcardid = eightcardid + "19";
225         eightcardid = eightcardid + fifteencardid.substring(6, 15);
226         eightcardid = eightcardid + getVerify(eightcardid);
227         return eightcardid;
228     }
229 }

时间: 2024-10-10 17:23:51

校验身份证号码(转载)的相关文章

JS校验身份证号码

var vcity = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽",

身份证号码的合法性校验

javascript版本的身份证号码的合法性校验 版权声明:本文为博主原创文章,未经博主允许不得转载.

黄聪:jquery 校验中国身份证号码

大陆18位身份证(第二代身份证) 身份号码是一组具有特征组合码,由十七位数字本体码和一位校验码组成. 排列顺序从左至右依次为:六位数字地区码,八位数字生日码,三位数字顺序码和一位数字校验码. 校验方法: (1)先对前17位数字的权求和 S = Sum(Ci * Vi), i = 0, ... , 16 Ci:表示身份证号码上第i位置的数字值 Vi:表示第i位置上的“加权因子”        加权因子Vi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (2)计算模(固定

Java实现身份证号码校验

二话不说,直接上代码. /** * 校验18位身份证号 * * @param identityCode * * 返回true则表示校验通过 */ public boolean checkIdentityCode(String identityCode) { // 校验身份证位数为18位 if (!identityCode.matches("\\d{17}(\\d|x|X)$")) { return false; } Date d = new Date(); DateFormat df

身份证号码生成与校验

在测试过程中难免会遇到需要身份证号码的情况,记录下随机生成身份证号码与如何检验身份证号码的方法. 首先要了解身份证号码的组成方式: 号码结构:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码(前六位数):表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 出生日期码(第七位至十四位):表示编码对象出生的年.月.日,按GB/T7408的规定执行,年.

二代身份证号码校验 Java版

未命名 import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.regex.Pattern;public class IdCardValidator {    public static void main(String[] args) {        System.out.printl

java身份证号码校验、邮箱校验、手机号码/电话号码校验

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ValidateUtils 

校验某人的身份证号码

#生成某年的所有日期 def dateRange(year): fmt = '%Y-%m-%d' bgn = int(time.mktime(time.strptime(year+'-01-01',fmt))) end = int(time.mktime(time.strptime(year+'-12-31',fmt))) list_date = [time.strftime(fmt,time.localtime(i)) for i in range(bgn,end+1,3600*24)] re

身份证号码工具类

转载自:http://www.3fwork.com/b200/002695MYM017139/ 身份证工具类,可以解析出身份证号是否通过校验.性别.年龄和出生所在地 一.居民身份证的简介      居民身份证号码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.居民身份证是国家法定的证明公民个人身份的有效证件.二.居民身份证的组成和结构      1.号码的结构      公民身份号码是特征组合码,由十七位数字本