//====================================================================
// Declare: f_idcardvalid(readonly string as_cardno,reference string as_msg).
//——————————————————————–
// 描述: 身份证号码检验
//——————————————————————–
// 参数: readonly string as_cardno
// reference string as_msg
//——————————————————————–
// 返回: 1 校验成功,-1 校验失败,并返回计算后的证件号,-2 校验失败,返回错误信息
//——————————————————————–
// 作者: ZXD 日期: 2021/01/18 10:02:59
//——————————————————————–
// CopyRight(c)
//——————————————————————–
// 修改历史:
//
//====================================================================
int li_i = 0,li_sum = 0
int li_char
string ls_tmp = ”,ls_cardno = ”,ls_card_valid = ”
string ls_birthday = ”
date ldt_birthday
int li_factor[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}
string ls_valid[11] = {‘1′,’0′,’X’,’9′,’8′,’7′,’6′,’5′,’4′,’3′,’2′}
ls_cardno = upper(trim(as_cardno))
if not (len(ls_cardno) = 15 or len(ls_cardno) = 18) then
as_msg = ‘非身份证号’
return – 2
end if
if not match(ls_cardno,'[0-9]+[0-9X]’) then
as_msg = ‘非身份证号,含非法字符’
return – 2
end if
// 如果为15位,先判断最后一位是否X,再转换为17位
if len(ls_cardno) = 15 then
if right(ls_cardno,1) = ‘X’ then
as_msg = ’15位身份证号,无检验位’
return – 2
end if
ls_tmp = left(ls_cardno,6) + ’19’ + right(ls_cardno,9)
ls_cardno = ls_tmp
end if
ls_birthday = mid(ls_cardno,7,4) + ‘-‘ + mid(ls_cardno,11,2) + ‘-‘ + mid(ls_cardno,13,2)
if not IsDate(ls_birthday) then
as_msg = ls_birthday + ‘非身份证号’
return – 2
end if
li_sum = 1
for li_i = 1 to 17
ls_tmp = mid(ls_cardno,li_i,1)
li_char = integer(ls_tmp)
li_sum += li_char * li_factor[li_i]
next
li_i = mod(li_sum,11)
if li_i = 0 then
li_i = 11
end if
ls_tmp = ls_valid[li_i]
ls_card_valid = left(ls_cardno,17) + ls_tmp // 计算后带检验码身份证号
as_msg = ls_card_valid
// 身份证号码重新计算检验位后与原证件号一致,验证通过
if upper(trim(as_cardno)) = ls_card_valid then
return 1
else
return – 1
end if