Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Алгоритм расчета контрольного числа ИНН

01.01.2007
{ **** UBPFD *********** by kladovka.net.ru ****
>> Алгоритм расчета контрольного числа ИНН
 
Зависимости: System, Sysutils
Автор:       Камбалов А.Н., ACampball@mail.ru, Вологда
Copyright:   Камбалов А.Н.
Дата:        3 июня 2002 г.
********************************************** }
 
// ===========================================
// Алгоритм расчета контрольного числа ИНН
// ===========================================
function CheckINN(const INN: string): Boolean;
const
  factor1
: array[0..8] of byte = (2, 4, 10, 3, 5, 9, 4, 6, 8);
  factor2
: array[0..9] of byte = (7, 2, 4, 10, 3, 5, 9, 4, 6, 8);
  factor3
: array[0..10] of byte = (3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8);
var
 i
: byte;
 sum
: word;
 sum2
: word;
begin
 
Result := False;
 
 
try
   
if Length(INN) = 10 then begin
      sum
:= 0;
     
for i:=0 to 8 do
        sum
:= sum + StrToInt(INN[i+1])*factor1[i];
      sum
:= sum mod 11;
      sum
:= sum mod 10;
     
Result := StrToInt(INN[10]) = sum;
   
end
   
else if Length(INN) = 12 then begin
      sum
:= 0;
     
for i:=0 to 9 do
        sum
:= sum + StrToInt(INN[i+1])*factor2[i];
      sum
:= sum mod 11;
      sum
:= sum mod 10;
      sum2
:= 0;
     
for i:=0 to 10 do
        sum2
:= sum2 + StrToInt(INN[i+1])*factor3[i];
      sum2
:= sum2 mod 11;
      sum2
:= sum2 mod 10;
     
Result := (StrToInt(INN[11]) = sum) and
               
(StrToInt(INN[12]) = sum2);
   
end; //
 
except
   
Result := False;
 
end; // try
end;