Delphi写的验证身份证号有效性函数(摘)

ExpandedBlockStart.gif function ValidatePID
//本文来自Delphi之窗,http://www.52delphi.com


function ValidatePID( const APID:  string):  string;
   { 内部函数,取身份证号校验位,最后一位,对18位有效 }
   function GetVerifyBit(sIdentityNum:  string): Char;
   var
    nNum: Integer;
   begin
    Result := # 0;
    nNum := StrToInt(sIdentityNum[ 1]) *  7 +
            StrToInt(sIdentityNum[ 2]) *  9 +
            StrToInt(sIdentityNum[ 3]) *  10 + 
            StrToInt(sIdentityNum[ 4]) *  5 + 
            StrToInt(sIdentityNum[ 5]) *  8 +
            StrToInt(sIdentityNum[ 6]) *  4 +
            StrToInt(sIdentityNum[ 7]) *  2 +
            StrToInt(sIdentityNum[ 8]) *  1 +
            StrToInt(sIdentityNum[ 9]) *  6 +
            StrToInt(sIdentityNum[ 10]) *  3 +
            StrToInt(sIdentityNum[ 11]) *  7 +
            StrToInt(sIdentityNum[ 12]) *  9 +
            StrToInt(sIdentityNum[ 13]) *  10 +
            StrToInt(sIdentityNum[ 14]) *  5 +
            StrToInt(sIdentityNum[ 15]) *  8 +
            StrToInt(sIdentityNum[ 16]) *  4 +
            StrToInt(sIdentityNum[ 17]) *  2;
    nNum := nNum  mod  11;
     case nNum  of
       0: Result :=  ' 1 ';
       1: Result :=  ' 0 ';
       2: Result :=  ' X ';
       3: Result :=  ' 9 ';
       4: Result :=  ' 8 ';
       5: Result :=  ' 7 ';
       6: Result :=  ' 6 ';
       7: Result :=  ' 5 ';
       8: Result :=  ' 4 ';
       9: Result :=  ' 3 ';
       10: Result :=  ' 2 ';
     end;
   end;
var
  L : Integer;
  sCentury :  string;
  sYear2Bit :  string;
  sMonth :  string;
  sDate :  string;
  iCentury : Integer;
  iMonth : Integer;
  iDate : Integer;
  CRCFact :  string;// 18位证号的实际值
  CRCTh :  string; // 18位证号的理论值
  FebDayAmt: Byte;// 2月天数
begin
  L := Length(APID);
   if (L  in [ 1518]) = False  then
   begin
     Result := Format( ' 身份证号不是15位或18位(%0:s, 实际位数:%1:d) ', [APID, L]);
     Exit;
   end;
  CRCFact :=  '';
   if L =  18  then
   begin
     sCentury := Copy(APID,  72);
     iCentury := StrToInt(sCentury);
      if (iCentury  in [ 18.. 20]) = False  then
      begin
        Result := Format( ' 身份证号码无效:18位证号的年份前两位必须在18-20之间(%0:S) ', [sCentury]);
        Exit;
      end;
     sYear2Bit := Copy(APID,  92);
     sMonth := Copy(APID,  112);
     sDate := Copy(APID,  132);
     CRCFact := Copy(APID,  181);
   end  else
   begin
     sCentury :=  ' 19 ';
     sYear2Bit := Copy(APID,  72);
     sMonth := Copy(APID,  92);
     sDate := Copy(APID,  112);
   end;
  iMonth := StrToInt(sMonth);
  iDate := StrToInt(sDate);
   if (iMonth  in [ 01.. 12]) = False  then
   begin
     Result := Format( ' 身份证号码无效:月份必须在01-12之间(%0:s) ', [sMonth]);
     Exit;
   end;
   if (iMonth  in [ 135781012])  then
   begin
      if (iDate  in [ 01.. 31]) = False  then
      begin
        Result := Format( ' 身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s) ', [sDate]);
        Exit;
      end;
   end;
   if (iMonth  in [ 46911])  then
   begin
      if (iDate  in [ 01.. 30]) = False  then
      begin
        Result := Format( ' 身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s) ', [sDate]);
        Exit;
      end;
   end;
   if IsLeapYear(StrToInt(sCentury + sYear2Bit)) = True  then
   begin
     FebDayAmt :=  29;
   end  else
   begin
     FebDayAmt :=  28;
   end;
   if (iMonth  in [ 2])  then
   begin
      if (iDate  in [ 01..FebDayAmt]) = False  then
      begin
        Result := Format( ' 身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s) ', [sDate]);
        Exit;
      end;
   end;
   if CRCFact <>  ''  then
   begin
     CRCTh := GetVerifyBit(APID);
      if CRCFact <> CRCTh  then
      begin
        Result := Format( ' 身份证号码无效:校验位(第18位)错:(%0:s) ', [APID]);
        Exit;
      end;
   end;
end;  

转载于:https://www.cnblogs.com/samsonleung/archive/2012/04/06/2435153.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值