zoukankan      html  css  js  c++  java
  • Delphi写的验证身份证号有效性函数(摘)

    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;  
  • 相关阅读:
    ES5新特性:理解 Array 中增强的 9 个 API
    ios
    Jquery异步 Deferred Object
    ES5中新增的Array方法详细说明
    Chart
    Angular常用语句
    vticker.js--垂直滚动插件
    <css系列>之css--float总结
    理解boot.img与静态分析Android/linux内核
    理解竞争条件( Race condition)漏洞
  • 原文地址:https://www.cnblogs.com/samsonleung/p/2435153.html
Copyright © 2011-2022 走看看