скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Алгоритм проверки контрольного числа ИНН и страхового номера ПФ



Автор: Камбалов Андрей

Модуль содержит две функции для проверки контрольного числа ИНН и страхового номера ПФ

CheckINN

- Функция вычисляет контрольное число ИНН и возвращает True если ИНН введен правильно или False в противном случае
В качестве параметра передается проверяемый ИНН
Для справки: структура ИНН
  • 10-ти разрядный ИНН - NNNNXXXXXC
  • 12-ти разрядный ИНН - NNNNXXXXXXCC где:
    • NNNN - номер налоговой инспекции
    • XXXXX, XXXXXX - порядковый номер налогоплательщика (номер записи в госреестре)
    • C - контрольное число в 10-ти разрядном ИНН
    • CC - контрольное число в 12-ти разрядном ИНН (фактически, идущие подряд две контрольные цифры)

CheckPFCertificate

- Функция вычисляет контрольное число страхового номера ПФ и возвращает True если оно введено правильно или False в противном случае

В качестве параметра передается страховой номер ПФ без разделителей

Проверка контрольного числа Страхового номера проводится только для номеров больше номера 001-001-998.

Контрольное число Страхового номера рассчитывается следующим образом: каждая цифра Страхового номера умножается на номер своей позиции (позиции отсчитываются с конца), полученные произведения суммируются, сумма делится на 101, последние две цифры остатка от деления являются Контрольным числом.

unit INN_PF;

// ===========================================
// Камбалов А.Н.
// ACampball@mail.ru
// ===========================================

interface

function CheckINN(const INN: string): Boolean;
function CheckPFCertificate(const PF: string): Boolean;

implementation

uses SysUtils;

// ==================================================================================================
// Функция вычисляет контрольное число ИНН и возвращает True если ИНН
// введен правильно или False в противном случае
// В качестве параметра передается проверяемый ИНН
// Для справки: структура ИНН
//              10-ти разрядный ИНН - NNNNXXXXXC
//              12-ти разрядный ИНН - NNNNXXXXXXCC
//              где: NNNN - номер налоговой инспекции
//                   XXXXX, XXXXXX - порядковый номер налогоплательщика (номер записи в госреестре)
//                   C - контрольное число в 10-ти разрядном ИНН
//                   CC - контрольное число в 12-ти разрядном ИНН
//                        (фактически, идущие подряд две контрольные цифры)
// ==================================================================================================

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;

// ===========================================
// Функция вычисляет контрольное число страхового номера ПФ и возвращает True если
// оно введено правильно или False в противном случае
// В качестве параметра передается страховой номер ПФ без разделителй
//
// Проверка контрольного числа Страхового номера проводится только для
// номеров больше  номера 001-001-998.
// Контрольное число Страхового номера рассчитывается следующим образом:
// каждая цифра Страхового номера умножается на номер своей позиции (позиции
// отсчитываются с конца), полученные произведения суммируются, сумма делится
// на 101, последние две цифры остатка от деления являются Контрольным числом.
// ===========================================

function CheckPFCertificate(const PF: string): Boolean;
var
  sum: Word;
  i: Byte;
begin
  Result := False;
  sum := 0;
  if Length(PF) <> 11 then Exit;

  try
    for i := 1 to 9 do
      sum := sum + StrToInt(PF[i]) * (9 - i + 1);
    sum := sum mod 101;
    Result := StrToInt(Copy(PF, 10, 2)) = sum;
  except
    Result := False;
  end; // try
end;

end.





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook