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
179
180
181
|
/**
* 身份证15位编码规则:dddddd yymmdd xx p
* dddddd:地区码
* yymmdd: 出生年月日
* xx: 顺序类编码,无法确定
* p: 性别,奇数为男,偶数为女
* <p>
* 身份证18位编码规则:dddddd yyyymmdd xxx y
* dddddd:地区码
* yyyymmdd: 出生年月日
* xxx:顺序类编码,无法确定,奇数为男,偶数为女
* y: 校验码,该位数值可通过前17位计算获得
* <p>
* 18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]
* 验证位 Y = [ 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 ]
* 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
* i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置
*
*/
// 构造函数,变量为15位或者18位的身份证号码
function IdCardValidate(CardNo) {
this
.Valid =
false
;
this
.ID15 =
‘‘
;
this
.ID18 =
‘‘
;
this
.Local =
‘‘
;
if
(CardNo !=
null
)
this
.SetCardNo(CardNo);
}
// 设置身份证号码,15位或者18位
IdCardValidate.prototype.SetCardNo = function(CardNo) {
this
.ID15 =
‘‘
;
this
.ID18 =
‘‘
;
this
.Local =
‘‘
;
CardNo = CardNo.replace(
" "
,
""
);
var strCardNo;
if
(CardNo.length ==
18
) {
pattern = /^\d{
17
}(\d|x|X)$/;
if
(pattern.exec(CardNo) ==
null
)
return
;
strCardNo = CardNo.toUpperCase();
}
else
{
pattern = /^\d{
15
}$/;
if
(pattern.exec(CardNo) ==
null
)
return
;
strCardNo = CardNo.substr(
0
,
6
) +
‘19‘
+ CardNo.substr(
6
,
9
)
strCardNo +=
this
.GetVCode(strCardNo);
}
this
.Valid =
this
.CheckValid(strCardNo);
}
// 校验身份证有效性
IdCardValidate.prototype.IsValid = function() {
return
this
.Valid;
}
// 返回生日字符串,格式如下,1981-10-10
IdCardValidate.prototype.GetBirthDate = function() {
var BirthDate =
‘‘
;
if
(
this
.Valid)
BirthDate =
this
.GetBirthYear() +
‘-‘
+
this
.GetBirthMonth() +
‘-‘
+
this
.GetBirthDay();
return
BirthDate;
}
// 返回生日中的年,格式如下,1981
IdCardValidate.prototype.GetBirthYear = function() {
var BirthYear =
‘‘
;
if
(
this
.Valid)
BirthYear =
this
.ID18.substr(
6
,
4
);
return
BirthYear;
}
// 返回生日中的月,格式如下,10
IdCardValidate.prototype.GetBirthMonth = function() {
var BirthMonth =
‘‘
;
if
(
this
.Valid)
BirthMonth =
this
.ID18.substr(
10
,
2
);
if
(BirthMonth.charAt(
0
) ==
‘0‘
)
BirthMonth = BirthMonth.charAt(
1
);
return
BirthMonth;
}
// 返回生日中的日,格式如下,10
IdCardValidate.prototype.GetBirthDay = function() {
var BirthDay =
‘‘
;
if
(
this
.Valid)
BirthDay =
this
.ID18.substr(
12
,
2
);
return
BirthDay;
}
// 返回性别,1:男,0:女
IdCardValidate.prototype.GetSex = function() {
var Sex =
‘‘
;
if
(
this
.Valid)
Sex =
this
.ID18.charAt(
16
) %
2
;
return
Sex;
}
// 返回15位身份证号码
IdCardValidate.prototype.Get15 = function() {
var ID15 =
‘‘
;
if
(
this
.Valid)
ID15 =
this
.ID15;
return
ID15;
}
// 返回18位身份证号码
IdCardValidate.prototype.Get18 = function() {
var ID18 =
‘‘
;
if
(
this
.Valid)
ID18 =
this
.ID18;
return
ID18;
}
// 返回所在省,例如:上海市、浙江省
IdCardValidate.prototype.GetLocal = function() {
var Local =
‘‘
;
if
(
this
.Valid)
Local =
this
.Local;
return
Local;
}
//获取身份证号码为18位时最后的验证位
IdCardValidate.prototype.GetVCode = function(CardNo17) {
var Wi =
new
Array(
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
);
var Ai =
new
Array(
‘1‘
,
‘0‘
,
‘X‘
,
‘9‘
,
‘8‘
,
‘7‘
,
‘6‘
,
‘5‘
,
‘4‘
,
‘3‘
,
‘2‘
);
var cardNoSum =
0
;
for
(var i =
0
; i < CardNo17.length; i++)
cardNoSum += CardNo17.charAt(i) * Wi[i];
var seq = cardNoSum %
11
;
return
Ai[seq];
}
IdCardValidate.prototype.CheckValid = function(CardNo18) {
if
(
this
.GetVCode(CardNo18.substr(
0
,
17
)) != CardNo18.charAt(
17
))
return
false
;
if
(!
this
.IsDate(CardNo18.substr(
6
,
8
)))
return
false
;
var aCity = {
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
:
"国外"
};
if
(aCity[parseInt(CardNo18.substr(
0
,
2
))] ==
null
)
return
false
;
this
.ID18 = CardNo18;
this
.ID15 = CardNo18.substr(
0
,
6
) + CardNo18.substr(
8
,
9
);
this
.Local = aCity[parseInt(CardNo18.substr(
0
,
2
))];
return
true
;
}
//验证18位数身份证号码中的生日是否是有效生日
IdCardValidate.prototype.IsDate = function(strDate) {
var r = strDate.match(/^(\d{
1
,
4
})(\d{
1
,
2
})(\d{
1
,
2
})$/);
if
(r ==
null
)
return
false
;
var d =
new
Date(r[
1
], r[
2
] -
1
, r[
3
]);
return
(d.getFullYear() == r[
1
] && (d.getMonth() +
1
) == r[
2
] && d
.getDate() == r[
3
]);
}</p>
|