Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
P
pica-cloud-clickhouse
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
成员
成员
收起侧边栏
Close sidebar
动态
分支图
统计图
提交
打开侧边栏
com.pica.cloud.clickhouse
pica-cloud-clickhouse
提交
2773961d
提交
2773961d
编写于
6月 10, 2019
作者:
liugen.wen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
xiu
上级
10db3854
变更
1
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
256 行增加
和
0 行删除
+256
-0
IdcardValidatorUtil.java
...use/clickhouse/server/controller/IdcardValidatorUtil.java
+256
-0
未找到文件。
server/src/main/java/com/pica/cloud/clickhouse/clickhouse/server/controller/IdcardValidatorUtil.java
0 → 100644
浏览文件 @
2773961d
package
com
.
pica
.
cloud
.
clickhouse
.
clickhouse
.
server
.
controller
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.GregorianCalendar
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.regex.Pattern
;
/**
* 类说明:身份证合法性校验
* 18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。
*/
public
class
IdcardValidatorUtil
{
// 每位加权因子
private
static
int
power
[]
=
{
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
};
// 第18位校检码
private
String
verifyCode
[]
=
{
"1"
,
"0"
,
"X"
,
"9"
,
"8"
,
"7"
,
"6"
,
"5"
,
"4"
,
"3"
,
"2"
};
/**
* 验证所有的身份证的合法性
*
* @param idcard
* @return
*/
public
static
boolean
isValidatedAllIdcard
(
String
idcard
)
{
if
(
idcard
.
length
()
==
15
)
{
idcard
=
convertIdcarBy15bit
(
idcard
);
}
return
isValidate18Idcard
(
idcard
);
}
/**
* 将15位的身份证转成18位身份证
*
* @param idcard
* @return
*/
public
static
String
convertIdcarBy15bit
(
String
idcard
)
{
String
idcard17
=
null
;
// 非15位身份证
if
(
idcard
.
length
()
!=
15
)
{
return
null
;
}
if
(
isDigital
(
idcard
))
{
// 获取出生年月日
String
birthday
=
idcard
.
substring
(
6
,
12
);
Date
birthdate
=
null
;
try
{
birthdate
=
new
SimpleDateFormat
(
"yyMMdd"
).
parse
(
birthday
);
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
Calendar
cday
=
Calendar
.
getInstance
();
cday
.
setTime
(
birthdate
);
String
year
=
String
.
valueOf
(
cday
.
get
(
Calendar
.
YEAR
));
idcard17
=
idcard
.
substring
(
0
,
6
)
+
year
+
idcard
.
substring
(
8
);
char
c
[]
=
idcard17
.
toCharArray
();
String
checkCode
=
""
;
if
(
null
!=
c
)
{
int
bit
[]
=
new
int
[
idcard17
.
length
()];
// 将字符数组转为整型数组
bit
=
converCharToInt
(
c
);
int
sum17
=
0
;
sum17
=
getPowerSum
(
bit
);
// 获取和值与11取模得到余数进行校验码
checkCode
=
getCheckCodeBySum
(
sum17
);
// 获取不到校验位
if
(
null
==
checkCode
)
{
return
null
;
}
// 将前17位与第18位校验码拼接
idcard17
+=
checkCode
;
}
}
else
{
// 身份证包含数字
return
null
;
}
return
idcard17
;
}
/**
* @param idcard
* @return
*/
public
static
boolean
isValidate18Idcard
(
String
idcard
)
{
// 非18位为假
if
(
idcard
.
length
()
!=
18
)
{
return
false
;
}
// 获取前17位
String
idcard17
=
idcard
.
substring
(
0
,
17
);
// 获取第18位
String
idcard18Code
=
idcard
.
substring
(
17
,
18
);
char
c
[]
=
null
;
String
checkCode
=
""
;
// 是否都为数字
if
(
isDigital
(
idcard17
))
{
c
=
idcard17
.
toCharArray
();
}
else
{
return
false
;
}
if
(
null
!=
c
)
{
int
bit
[]
=
new
int
[
idcard17
.
length
()];
bit
=
converCharToInt
(
c
);
int
sum17
=
0
;
sum17
=
getPowerSum
(
bit
);
// 将和值与11取模得到余数进行校验码判断
checkCode
=
getCheckCodeBySum
(
sum17
);
if
(
null
==
checkCode
)
{
return
false
;
}
// 将身份证的第18位与算出来的校码进行匹配,不相等就为假
if
(!
idcard18Code
.
equalsIgnoreCase
(
checkCode
))
{
return
false
;
}
}
return
true
;
}
/**
* 18位身份证号码的基本数字和位数验校
*
* @param idcard
* @return
*/
public
boolean
is18Idcard
(
String
idcard
)
{
return
Pattern
.
matches
(
"^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$"
,
idcard
);
}
/**
* 数字验证
*
* @param str
* @return
*/
public
static
boolean
isDigital
(
String
str
)
{
return
str
==
null
||
""
.
equals
(
str
)
?
false
:
str
.
matches
(
"^[0-9]*$"
);
}
/**
* 将身份证的每位和对应位的加权因子相乘之后,再得到和值
*
* @param bit
* @return
*/
public
static
int
getPowerSum
(
int
[]
bit
)
{
int
sum
=
0
;
if
(
power
.
length
!=
bit
.
length
)
{
return
sum
;
}
for
(
int
i
=
0
;
i
<
bit
.
length
;
i
++)
{
for
(
int
j
=
0
;
j
<
power
.
length
;
j
++)
{
if
(
i
==
j
)
{
sum
=
sum
+
bit
[
i
]
*
power
[
j
];
}
}
}
return
sum
;
}
/**
* 将和值与11取模得到余数进行校验码判断
* @param sum17
* @return 校验位
*/
public
static
String
getCheckCodeBySum
(
int
sum17
)
{
String
checkCode
=
null
;
switch
(
sum17
%
11
)
{
case
10
:
checkCode
=
"2"
;
break
;
case
9
:
checkCode
=
"3"
;
break
;
case
8
:
checkCode
=
"4"
;
break
;
case
7
:
checkCode
=
"5"
;
break
;
case
6
:
checkCode
=
"6"
;
break
;
case
5
:
checkCode
=
"7"
;
break
;
case
4
:
checkCode
=
"8"
;
break
;
case
3
:
checkCode
=
"9"
;
break
;
case
2
:
checkCode
=
"x"
;
break
;
case
1
:
checkCode
=
"0"
;
break
;
case
0
:
checkCode
=
"1"
;
break
;
}
return
checkCode
;
}
/**
* 将字符数组转为整型数组
*
* @param c
* @return
* @throws NumberFormatException
*/
public
static
int
[]
converCharToInt
(
char
[]
c
)
throws
NumberFormatException
{
int
[]
a
=
new
int
[
c
.
length
];
int
k
=
0
;
for
(
char
temp
:
c
)
{
a
[
k
++]
=
Integer
.
parseInt
(
String
.
valueOf
(
temp
));
}
return
a
;
}
public
static
void
main
(
String
[]
args
){
String
idcard
=
"152322731107074"
;
//15位
// String idcard = "430423201105253934";//18位
// String idcard = "362227198510031212";//18位
if
(
IdcardValidatorUtil
.
isValidatedAllIdcard
(
idcard
))
{
System
.
out
.
println
((
"TAG"
+
"身份证校验正确!"
));
}
else
{
System
.
out
.
println
((
"TAG"
+
"身份证校验错误!"
));
}
}
}
写
预览
Markdown
格式
0%
请重试
or
附加一个文件
附加文件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录