转载自:http://www.cnblogs.com/jkfeng/p/4642804.html
js校验身份证号【15位和18位】
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
[javascript] view plaincopyprint?
function scCard(){
var scType=document.getElementById(
"sc_card_type"
).value;
if
(scType==
"1"
){
var scCard=document.getElementById(
"sc_card_num"
).value;
if
(scCard.length!=
0
){
if
(!checkCard(scCard)){
$(
"#errorTips"
).html(
"身份证号码格式错误"
);
}
else
{
$(
"#errorTips"
).html(
""
);
}
}
}
return
false
;
}
//function checkidno(obj) {
var vcity={
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
:
"澳门"
,
91
:
"国外"
};
checkCard = function(obj)
{
//var card = document.getElementById('card_no').value;
//是否为空
// if(card === '')
// {
// return false;
//}
//校验长度,类型
if
(isCardNo(obj) ===
false
)
{
return
false
;
}
//检查省份
if
(checkProvince(obj) ===
false
)
{
return
false
;
}
//校验生日
if
(checkBirthday(obj) ===
false
)
{
return
false
;
}
//检验位的检测
if
(checkParity(obj) ===
false
)
{
return
false
;
}
return
true
;
};
//检查号码是否符合规范,包括长度,类型
isCardNo = function(obj)
{
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
var reg = /(^\d{
15
}$)|(^\d{
17
}(\d|X)$)/;
if
(reg.test(obj) ===
false
)
{
return
false
;
}
return
true
;
};
//取身份证前两位,校验省份
checkProvince = function(obj)
{
var province = obj.substr(
0
,
2
);
if
(vcity[province] == undefined)
{
return
false
;
}
return
true
;
};
//检查生日是否正确
checkBirthday = function(obj)
{
var len = obj.length;
//身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
if
(len ==
'15'
)
{
var re_fifteen = /^(\d{
6
})(\d{
2
})(\d{
2
})(\d{
2
})(\d{
3
})$/;
var arr_data = obj.match(re_fifteen);
var year = arr_data[
2
];
var month = arr_data[
3
];
var day = arr_data[
4
];
var birthday =
new
Date(
'19'
+year+
'/'
+month+
'/'
+day);
return
verifyBirthday(
'19'
+year,month,day,birthday);
}
//身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
if
(len ==
'18'
)
{
var re_eighteen = /^(\d{
6
})(\d{
4
})(\d{
2
})(\d{
2
})(\d{
3
})([
0
-
9
]|X)$/;
var arr_data = obj.match(re_eighteen);
var year = arr_data[
2
];
var month = arr_data[
3
];
var day = arr_data[
4
];
var birthday =
new
Date(year+
'/'
+month+
'/'
+day);
return
verifyBirthday(year,month,day,birthday);
}
return
false
;
};
//校验日期
verifyBirthday = function(year,month,day,birthday)
{
var now =
new
Date();
var now_year = now.getFullYear();
//年月日是否合理
if
(birthday.getFullYear() == year && (birthday.getMonth() +
1
) == month && birthday.getDate() == day)
{
//判断年份的范围(3岁到100岁之间)
var time = now_year - year;
if
(time >=
0
&& time <=
130
)
{
return
true
;
}
return
false
;
}
return
false
;
};
//校验位的检测
checkParity = function(obj)
{
//15位转18位
obj = changeFivteenToEighteen(obj);
var len = obj.length;
if
(len ==
'18'
)
{
var arrInt =
new
Array(
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
);
var arrCh =
new
Array(
'1'
,
'0'
,
'X'
,
'9'
,
'8'
,
'7'
,
'6'
,
'5'
,
'4'
,
'3'
,
'2'
);
var cardTemp =
0
, i, valnum;
for
(i =
0
; i <
17
; i ++)
{
cardTemp += obj.substr(i,
1
) * arrInt[i];
}
valnum = arrCh[cardTemp %
11
];
if
(valnum == obj.substr(
17
,
1
))
{
return
true
;
}
return
false
;
}
return
false
;
};
//15位转18位身份证号
changeFivteenToEighteen = function(obj)
{
if
(obj.length ==
'15'
)
{
var arrInt =
new
Array(
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
);
var arrCh =
new
Array(
'1'
,
'0'
,
'X'
,
'9'
,
'8'
,
'7'
,
'6'
,
'5'
,
'4'
,
'3'
,
'2'
);
var cardTemp =
0
, i;
obj = obj.substr(
0
,
6
) +
'19'
+ obj.substr(
6
, obj.length -
6
);
for
(i =
0
; i <
17
; i ++)
{
cardTemp += obj.substr(i,
1
) * arrInt[i];
}
obj += arrCh[cardTemp %
11
];
return
obj;
}
return
obj;
};
|
JAVA校验
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
|
package
com.ebiz.base.utils;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.GregorianCalendar;
import
java.util.List;
import
java.util.regex.Matcher;
import
java.util.regex.Pattern;
import
com.ebiz.base.consts.BaseConst;
import
com.ebiz.base.consts.ConfigConst;
import
com.ebiz.base.consts.ExceptionConst;
import
com.ebiz.framework.util.date.DateUtil;
import
com.ebiz.framework.util.date.DateValidate;
import
com.ebiz.framework.util.validate.ValidateUtil;
import
com.ebiz.persistence.laputa.FndPageRule;
import
com.hp.hpl.sparta.ParseException;
public
class
CheckIdentificationUtil {
public
static
void
main(String[] args) {
System.out.println(idCardValidate(
"370802940221002"
));
}
/**功能 18位 身份证的校验
* @param idStr
* @return ParseException 1001
* @throws Exception
* @throws ParseException
* @throws NumberFormatException
* @throws java.text.ParseException
* @author wangming
*/
public
static
String idCardValidate(String idStr) {
if
(idStr ==
null
|| ( idStr.length() !=
15
&& idStr.length() !=
18
)) {
return
BaseConst.PUBLIC_RESPONSE_FAIL;
}
if
( idStr.length() ==
15
){
StringBuilder sb =
new
StringBuilder();
sb.append(idStr.substring(
0
,
6
))
.append(
"19"
)
.append(idStr.substring(
6
));
try
{
sb.append(getVerifyCode(sb.toString()));
idStr = sb.toString();
}
catch
(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(sb);
}
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 =idStr.substring(
0
,
17
);
if
(ValidateUtil.isDigit(ai) ==
false
) {
errorInfo = ExceptionConst.PAXINFO_CARD_ISNOTNUM;
return
errorInfo;
}
// ================ 出生年月是否有效 ================
String strYear = ai.substring(
6
,
10
);
// 年份
String strMonth = ai.substring(
10
,
12
);
// 月份
String strDay = ai.substring(
12
,
14
);
// 月份
if
(DateValidate.isStrDate(ai.substring(
6
,
14
))==
false
) {
errorInfo = ExceptionConst.PAXINFO_CARD_BIRTHDAY_OVER;
//"身份证生日无效。";
return
errorInfo;
}
GregorianCalendar gc =
new
GregorianCalendar();
SimpleDateFormat s =
new
SimpleDateFormat(
"yyyy-MM-dd"
);
Date limitDate=DateUtil.getIntervalDate(
new
Date(),DateUtil.BEFORE,
"150Y"
);
Date dd =
null
;
try
{
dd = s.parse(strYear +
"-"
+ strMonth +
"-"
+ strDay);
}
catch
(java.text.ParseException e) {
//类型转换异常
errorInfo =
"ParseException"
;
return
errorInfo;
}
if
(DateValidate.isDateBefore(dd,limitDate)) {
errorInfo = ExceptionConst.PAXINFO_CARD_BIRTHDAY_OVER;
//"身份证生日不在有效范围。";
return
errorInfo;
}
// ================ 地区码是否有效 ================
if
(ConfigConst.CARD_AREA_CODE.indexOf(ai.substring(
0
,
2
))<
0
) {
errorInfo = ExceptionConst.PAXINFO_CARD_AREA_OVER;
|