转载地址:http://www.w3china.org/blog/more.asp?name=lhwork&id=19148
import
java.util.regex.*;
/**
*
<p>
Title:
验证
18/15
位中国公民身份证号码,并分析有效的数据
</p>
*
<p>
Description:
</p>
*
<p>
Copyright:
Copyright
(c)
2004
</p>
*
<p>
Company:
Labile
</p>
*
@author
not
attributable
*
@version
1.0
*/
public
class
Verifier {
private
static
final
String
verify18PatternStr
=
"(\\d{6})"
+
"(\\d{8})"
+
"(\\d{3})"
+
"([\\d[xX]]{1})"
;
private
static
final
Pattern
verify18Pattern
= Pattern.compile(
verify18PatternStr
);
private
static
final
String
verify15PatternStr
=
"(\\d{6})"
+
"(\\d{6})"
+
"(\\d{3})"
;
private
static
final
Pattern
verify15Pattern
= Pattern.compile(
verify15PatternStr
);
/**
*
从第
18
到第
1
位的权
*/
private
static
final
int
verify18Rights
[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
/**
*
检验码校对表
*/
private
static
final
String
verify18CheckDigit
[] = {
"1"
,
"0"
,
"X"
,
"9"
,
"8"
,
"7"
,
"6"
,
"5"
,
"4"
,
"3"
,
"2"
};
/**
*
地区码
*/
private
String
areaNum
;
/**
*
出生时间
*/
private
String
birthdayNum
;
/**
*
顺序号
*/
private
String
seqNum
;
/**
*
校验码
*/
private
String
check_digit
;
private
int
length
;
public
boolean
isMan() {
int
num = Integer.parseInt(
seqNum
);
if
(num%2==1) {
return
true
;
}
else
return
false
;
}
/**
*
得到生日的日期,格式:
yyyy
-
mm
-
dd
*
@return
String
*/
public
String getBirthday() {
String FullBirthdayNum =
null
;
if
(
length
==15)
//
在生日号码前加
“19”
FullBirthdayNum =
"19"
+
birthdayNum
;
else
FullBirthdayNum =
birthdayNum
;
String year = FullBirthdayNum.substring(0, 4);
String month = FullBirthdayNum.substring(4, 6);
String date = FullBirthdayNum.substring(6, 8);
return
year +
"-"
+ month +
"-"
+ date;
}
public
Verifier(String IDCardNO)
throws
LengthIllegalException, CheckDigitInvalidException, NumberInvalidException {
if
(IDCardNO ==
null
)
throw
new
NumberInvalidException();
length
= IDCardNO.length();
switch
(
length
) {
case
15:
Verifier15(IDCardNO);
break
;
case
18:
Verifier18(IDCardNO);
break
;
default
:
throw
new
LengthIllegalException();
}
}
private
void
Verifier15(String IDCardNO)
throws
NumberInvalidException {
Matcher m =
verify15Pattern
.matcher(IDCardNO);
if
(m.matches()==
false
) {
throw
new
NumberInvalidException();
}
areaNum
= m.group(1);
birthdayNum
= m.group(2);
seqNum
= m.group(3);
}
private
void
Verifier18(String IDCardNO)
throws
CheckDigitInvalidException, NumberInvalidException {
Matcher m =
verify18Pattern
.matcher(IDCardNO);
if
(m.matches()==
false
) {
throw
new
NumberInvalidException();
}
areaNum
= m.group(1);
birthdayNum
= m.group(2);
seqNum
= m.group(3);
check_digit
= m.group(4);
//
预期的校验位
:
String expect_check_digit = getCheck_digit18(IDCardNO);
//
如果校验位无效
if
(expect_check_digit.equalsIgnoreCase(
check_digit
)==
false
)
throw
new
CheckDigitInvalidException();
}
/**
*
从
18
位
/17
位身份证号算出校验位
*
@param
IDCardNO
String
*
@return
String
*/
public
static
String getCheck_digit18(String IDCardNO) {
//
权总值
int
sum = 0;
for
(
int
i=0; i<=16; i++) {
int
num = Integer.parseInt( IDCardNO.substring(i,i + 1) );
int
right =
verify18Rights
[i];
sum = sum + num*right;
}
//
对权总值取模
int
y = sum % 11;
return
verify18CheckDigit
[y];
}
public
static
String IDCardNO15To18(String IDCardNO15)
throws
NumberInvalidException {
Matcher m =
verify15Pattern
.matcher(IDCardNO15);
if
(m.matches()==
false
) {
throw
new
NumberInvalidException();
}
String NO17 = IDCardNO15.substring(0,6) +
"19"
+ IDCardNO15.substring(6,15);
return
NO17 + getCheck_digit18(NO17);
}
public
String getAreaNum() {
return
areaNum
;
}
public
String getBirthdayNum() {
return
birthdayNum
;
}
/**
*
返回校验位,只有
18
位身份证可用,
15
位时返回
null
*
@return
String
*/
public
String getCheck_digitNum18() {
return
check_digit
;
}
public
int
getLength() {
return
length
;
}
public
String getSeqNum() {
return
seqNum
;
}
}
import
java.util.regex.*;
/**
*
<p>
Title:
验证
18/15
位中国公民身份证号码,并分析有效的数据
</p>
*
<p>
Description:
</p>
*
<p>
Copyright:
Copyright
(c)
2004
</p>
*
<p>
Company:
Labile
</p>
*
@author
not
attributable
*
@version
1.0
*/
public
class
Verifier {
private
static
final
String
verify18PatternStr
=
"(\\d{6})"
+
"(\\d{8})"
+
"(\\d{3})"
+
"([\\d[xX]]{1})"
;
private
static
final
Pattern
verify18Pattern
= Pattern.compile(
verify18PatternStr
);
private
static
final
String
verify15PatternStr
=
"(\\d{6})"
+
"(\\d{6})"
+
"(\\d{3})"
;
private
static
final
Pattern
verify15Pattern
= Pattern.compile(
verify15PatternStr
);
/**
*
从第
18
到第
1
位的权
*/
private
static
final
int
verify18Rights
[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
/**
*
检验码校对表
*/
private
static
final
String
verify18CheckDigit
[] = {
"1"
,
"0"
,
"X"
,
"9"
,
"8"
,
"7"
,
"6"
,
"5"
,
"4"
,
"3"
,
"2"
};
/**
*
地区码
*/
private
String
areaNum
;
/**
*
出生时间
*/
private
String
birthdayNum
;
/**
*
顺序号
*/
private
String
seqNum
;
/**
*
校验码
*/
private
String
check_digit
;
private
int
length
;
public
boolean
isMan() {
int
num = Integer.parseInt(
seqNum
);
if
(num%2==1) {
return
true
;
}
else
return
false
;
}
/**
*
得到生日的日期,格式:
yyyy
-
mm
-
dd
*
@return
String
*/
public
String getBirthday() {
String FullBirthdayNum =
null
;
if
(
length
==15)
//
在生日号码前加
“19”
FullBirthdayNum =
"19"
+
birthdayNum
;
else
FullBirthdayNum =
birthdayNum
;
String year = FullBirthdayNum.substring(0, 4);
String month = FullBirthdayNum.substring(4, 6);
String date = FullBirthdayNum.substring(6, 8);
return
year +
"-"
+ month +
"-"
+ date;
}
public
Verifier(String IDCardNO)
throws
LengthIllegalException, CheckDigitInvalidException, NumberInvalidException {
if
(IDCardNO ==
null
)
throw
new
NumberInvalidException();
length
= IDCardNO.length();
switch
(
length
) {
case
15:
Verifier15(IDCardNO);
break
;
case
18:
Verifier18(IDCardNO);
break
;
default
:
throw
new
LengthIllegalException();
}
}
private
void
Verifier15(String IDCardNO)
throws
NumberInvalidException {
Matcher m =
verify15Pattern
.matcher(IDCardNO);
if
(m.matches()==
false
) {
throw
new
NumberInvalidException();
}
areaNum
= m.group(1);
birthdayNum
= m.group(2);
seqNum
= m.group(3);
}
private
void
Verifier18(String IDCardNO)
throws
CheckDigitInvalidException, NumberInvalidException {
Matcher m =
verify18Pattern
.matcher(IDCardNO);
if
(m.matches()==
false
) {
throw
new
NumberInvalidException();
}
areaNum
= m.group(1);
birthdayNum
= m.group(2);
seqNum
= m.group(3);
check_digit
= m.group(4);
//
预期的校验位
:
String expect_check_digit = getCheck_digit18(IDCardNO);
//
如果校验位无效
if
(expect_check_digit.equalsIgnoreCase(
check_digit
)==
false
)
throw
new
CheckDigitInvalidException();
}
/**
*
从
18
位
/17
位身份证号算出校验位
*
@param
IDCardNO
String
*
@return
String
*/
public
static
String getCheck_digit18(String IDCardNO) {
//
权总值
int
sum = 0;
for
(
int
i=0; i<=16; i++) {
int
num = Integer.parseInt( IDCardNO.substring(i,i + 1) );
int
right =
verify18Rights
[i];
sum = sum + num*right;
}
//
对权总值取模
int
y = sum % 11;
return
verify18CheckDigit
[y];
}
public
static
String IDCardNO15To18(String IDCardNO15)
throws
NumberInvalidException {
Matcher m =
verify15Pattern
.matcher(IDCardNO15);
if
(m.matches()==
false
) {
throw
new
NumberInvalidException();
}
String NO17 = IDCardNO15.substring(0,6) +
"19"
+ IDCardNO15.substring(6,15);
return
NO17 + getCheck_digit18(NO17);
}
public
String getAreaNum() {
return
areaNum
;
}
public
String getBirthdayNum() {
return
birthdayNum
;
}
/**
*
返回校验位,只有
18
位身份证可用,
15
位时返回
null
*
@return
String
*/
public
String getCheck_digitNum18() {
return
check_digit
;
}
public
int
getLength() {
return
length
;
}
public
String getSeqNum() {
return
seqNum
;
}
}