身份证格式验证
const
cCityCode: array[0..91] of string = (
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'???? ', 'Ìì?ò ', 'ºÓ?? ', 'É?Î? ', 'ÄÚÃÉ?Å ', ' ', ' ', ' ', ' ', ' ',
'ÁÉÄþ ', '?ªÁÖ ', 'ºÚÁú?, ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'ÉϺ? ', '?,ËÕ ', 'Õã?, ', '??Î? ', '???? ', '?,Î? ', 'É??? ', ' ', ' ', ' ',
'ºÓÄÏ ', 'ºþ?? ', 'ºþÄÏ ', '?ã?? ', '?ãÎ? ', 'º?ÄÏ ', ' ', ' ', ' ',
'ÖØÇì ', 'ËÄ?? ', '?óÖÝ ', 'ÔÆÄÏ ', 'Î??Ø ', ' ', ' ', ' ', ' ', ' ', ' ',
'ÉÂÎ? ', '?ÊËà ', 'Çàº? ', 'ÄþÏÄ ', 'ÐÂ?? ', ' ', ' ', ' ', ' ', ' ',
'Ì?Íå ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'Ïã?Û ', '?ÄÃÅ ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'?úÍâ ');
function CheckCidInfo(mCidCode: string): Variant;
var
S: set of Char;
I: Integer;
vDateTime: TDateTime;
T: Double;
IsCheckPack:TDataPacket;
begin
IsCheckPack := TDataPacket.Create;
IsCheckPack.Initializtion(5);
IsCheckPack.Append;
if Length(mCidCode) <> 18 then
begin
IsCheckPack.Add('result','F');
IsCheckPack.Add('error','#?àÂë?ØÐëÊÇ18Î?');
Result := IsCheckPack.Value;
Exit;
end;
S := [];
for I := 1 to 17 do Include(S, mCidCode[I]);
if S - [ '0'.. '9'] <> [] then
begin
IsCheckPack.Add('result','F');
IsCheckPack.Add('error','#?àÂëÇ?17Î??ØÐëÊÇÊý×Ö');
Result := IsCheckPack.Value;
Exit;
end;
if not (mCidCode[18] in [ '0'.. '9', 'x', 'X']) then
begin
IsCheckPack.Add('result','F');
IsCheckPack.Add('error','#×îºóÒ?Î??ØÐëÊÇÊý×Ö?òÕßÊÇX');
Result := IsCheckPack.Value;
Exit;
end;
I := StrToIntDef(Copy(mCidCode, 1, 2), 0);
if (I > High(cCityCode)) or (cCityCode[I] = ' ') then
begin
IsCheckPack.Add('result','F');
IsCheckPack.Add('error','#µØÖ?Âë??ÕýÈ?');
Result := IsCheckPack.Value;
Exit;
end;
//µØÇø
// Result := 'µØÇø: ' + cCityCode[I];
if not TryStrToDate(Copy(mCidCode, 7, 4) + '-' +
Copy(mCidCode, 11, 2) + '-' + Copy(mCidCode, 13, 2), vDateTime) then
begin
IsCheckPack.Add('result','F');
IsCheckPack.Add('error','#ÉúÈÕÂë??ÕýÈ?:'+ Copy(mCidCode, 7, 4) + '-' +
Copy(mCidCode, 11, 2) + '-' + Copy(mCidCode, 13, 2));
Result := IsCheckPack.Value;;
Exit;
end;
if (vDateTime > Date) or (vDateTime < StrToDate( '1900-10-01')) then
begin
IsCheckPack.Add('result','F');
IsCheckPack.Add('error','#ÉúÈÕ???ûºÏÂß?, ');
Result := IsCheckPack.Value;
Exit;
end;
//ÉúÈÕ
// Result := Result + ' ÉúÈÕ: ' + FormatDateTime( 'yyyy-mm-dd ', vDateTime);
if mCidCode[18] in [ 'x', 'X'] then mCidCode[18] :=
'a';
T := 0;
for I := 18 downto 1 do
T := T + Trunc(Power(2, I - 1)) mod 11 *
StrToInt( '' + mCidCode[19 - I]);
if Trunc(T) mod 11 <> 1 then
begin
IsCheckPack.Add('result','F');
IsCheckPack.Add('error','#?Ç??Ð?ÑéÂë '+ IntToStr(Trunc(T)
mod 11));
Result := IsCheckPack.Value;
Exit;
end;
IsCheckPack.Add('result','T');
IsCheckPack.Add('dq',cCityCode[I]);
IsCheckPack.Add('sr',FormatDateTime( 'yyyy-mm-dd', vDateTime));
IsCheckPack.Add('xb',Copy(WideString( 'ÄÐÅ? '), Ord(Ord(mCidCode[17]) mod 2 = 0) + 1, 1));
Result := IsCheckPack.Value;
//ÐÔ?ð
// Result := Result + ' ÐÔ?ð: ' + // Copy(WideString( 'ÄÐÅ? '), Ord(Ord(mCidCode[17]) mod 2
= 0) + 1, 1);
end;