importjava.text.DateFormat;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.regex.Pattern;
publicclass IdCardValidator {
public static void main(String [] args){
System.out.println(valideIdCard(“ 111111111111111111111”));
}
公共静态布尔valideIdCard(字符串idCard){
String idCardPattern =“ ^ \\ d {17}(\\ d | X)$”; //前17位是数字,后一位是数字或X
/ *
11北京
12天津市
河北省13
山西省14
15个内蒙古自治区
辽宁省21
22吉林省
黑龙江省23
31上海
32江苏省
33浙江省
安徽省34
福建省35
江西省36
山东省37
河南省41
湖北省42
43湖南省
44广东省
广西壮族自治区45个
海南省46
50重庆市
四川省51
52贵州省
云南省53
54个西藏自治区
陕西省61
甘肃省62
63青海省
宁夏64个自治区
65新疆维吾尔自治区
71台湾省
81香港特别行政区
82个澳门特别行政区
* /
字符串省份=“ 11、12、13、14、15、21,22、23、31、32、33、34、35、36、37、41、42、43、44、45、46、50号校验位,51,52,53,54,61,62,63,64,65,71,81,82“;
//验证长度
if(idCard.length()!= 18){
返回假;
}
//验证格式
if(!Pattern.matches(idCardPattern,idCard)){
返回假;
}
//验证省区代码
如果(!provinces.contains(idCard.substring(0,2))){
返回假;
}
//验证年份,月份和日期
DateFormat df = new SimpleDateFormat(“ yyyyMMdd”);
尝试{
日期生日= df.parse(idCard.substring(6,14));
日期分钟= df.parse(“ 19000101”);
日期最大值= df.parse(df.format(newDate()));
if(birthday.before(min)|| Birthday.after(max)){
returnfalse;
}
} catch(ParseExceptione){
返回假;
}
//验证校验位
/ *
ID号最后一位的验证码的算法如下:
∑(a [i] * W [i])mod 11(i = 2,3,...,18)
“ *”: 表示乘法符号
i: 表示ID号每个数字的序列号,从右到左,最左侧为18,最右侧为1.
a [i]: 表示号的第i位数字
W [i]: 表示第i个位置W [i] = 2 ^(i-1)mod 11的权重值
设置: R = ∑(a [i] * W [i])mod 11(i = 2,3,...,18)
C = ID号的验证码
R和C之间的对应关系如下:
R: 0 1 2 3 4 5 6 7 8 9 10
C: 1 0 X 9 8 7 6 5 4 32
这表明X为10,罗马数字中的10为X,因此新的标准ID号可能包含非数字字母X.
* /
char残基[] = {'1'号校验位,'0','X','9','8','7','6','5','4','3',' 2'};
长期总和= 0;
for(inti = 0; i <17; i ++){
sum + = Integer.valueOf(idCard.substring(i,i + 1))*(Math.pow(2,(18-1-i)));
}
returnidCard.charAt(17)==残基[(int)(sum)];
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-244538-1.html