您的位置:首页 > 其它

身份证验证

2007-10-08 00:07 204 查看
function IDCheck(e: string): Boolean;

var

arrVerifyCode, Wi, Checker: TStringList;

Ai: string;

strYear, strMonth, strDay, BirthDay: string;

i, TotalmulAiWi, modValue: Integer;

strVerifyCode: string;

begin

arrVerifyCode := SplitString('1,0,x,9,8,7,6,5,4,3,2', ',');

Wi := SplitString('7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2', ',');

Checker := SplitString('1,9,8,7,6,5,4,3,2,1,1', ',');

if (Length(e) < 15) or (Length(e) = 17) or (Length(e) > 18) then

begin

result := False; //IDCheck= "身份证号共有 15 位或16位或18位"

Exit;

end;

if (Length(e) = 16) and ((not IsNumerice(Copy(e, 16, 1))) and (LowerCase(Copy(e, 16, 1)) <> 'x')) then

begin

result := False; //IDCheck= "身份证号16位或最后一位为数值或X"

Exit;

end;

if Length(e) = 18 then

begin

Ai := Copy(e, 1, 17);

end

else

begin

Ai := e; //15,16位身份证

Ai := Copy(Ai, 1, 6) + '19' + Copy(Ai, 7, 9);

end;

if not IsNumerice(Ai) then

begin

Result := False; //IDCheck= "身份证除最后一位外,必须为数字!"

Exit;

end;

strYear := Copy(Ai, 7, 4);

strMonth := Copy(Ai, 11, 2);

strDay := Copy(Ai, 13, 2);

BirthDay := Trim(strYear) + '-' + Trim(strMonth) + '-' + Trim(strDay);

if IsDate(BirthDay) then

begin

// ShowMessage(IntToStr( Now - StrToDate(BirthDay))); 1790 2007

if (StrToInt(Copy(FormatDateTime('YYYY-MM-DD', Now), 1, 4)) - StrToInt(strYear) > 100) or (strtoDateTime(BirthDay) > date) then

begin

result := False; //IDCheck= "身份证输入错误!" 352625185012035477

Exit;

end;

end

else

begin

result := False; //IDCheck= "身份证输入错误!"

Exit;

end;

for i := 0 to 16 do

begin

TotalmulAiWi := TotalmulAiWi + StrToInt(Copy(Ai, i + 1, 1)) * StrToInt(Wi[i]);

end;

modValue := TotalmulAiWi mod 11;

strVerifyCode := arrVerifyCode[modValue];

Ai := Ai + strVerifyCode;

if (Length(e) = 18) and (e <> Ai) then

begin

Result := False; //IDCheck= "身份证号码输入错误!"

Exit;

end;

Result := True;

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: