Проверка ИНН, КПП и ОГРН

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана - студенческое сообщество
Версия от 10:44, 6 декабря 2013; 217.14.52.2 (обсуждение) (ОГРН: косяк в проверке ОГРН ИП)

Перейти к: навигация, поиск

Что такое ИНН, КПП, ОГРН и как программно проверять их значения на корректность. Бонусом к статье идёт готовое приложение под Windows.

Теория

Сначала, что это такое:

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

Ниже приведены программные решения этой задачи. Индусский код инклюдед.

Практика

C#

ИНН

  1. /// <summary>
  2. /// проверка ИНН по контрольной цифре
  3. /// </summary>
  4. /// <param name="INN">ИНН для проверки</param>
  5. /// <returns>true - если проходит проверку, false - если не проходит проверку</returns>
  6. public bool check_INN(string INNstring)
  7. {
  8.     // является ли вообще числом
  9.     try { Int64.Parse(INNstring); } catch { return false; }
  10.  
  11.     // проверка на 10 и 12 цифр
  12.     if (INNstring.Length != 10 && INNstring.Length != 12) { return false; }
  13.  
  14.     // проверка по контрольным цифрам
  15.     if (INNstring.Length == 10) // для юридического лица
  16.     {
  17.         int dgt10 = 0;
  18.         try
  19.         {
  20.             dgt10 = (((2 * Int32.Parse(INNstring.Substring(0,1))
  21.                 + 4 * Int32.Parse(INNstring.Substring(1,1))
  22.                 + 10 * Int32.Parse(INNstring.Substring(2,1))
  23.                 + 3 * Int32.Parse(INNstring.Substring(3,1))
  24.                 + 5 * Int32.Parse(INNstring.Substring(4,1))
  25.                 + 9 * Int32.Parse(INNstring.Substring(5,1))
  26.                 + 4 * Int32.Parse(INNstring.Substring(6,1))
  27.                 + 6 * Int32.Parse(INNstring.Substring(7,1))
  28.                 + 8 * Int32.Parse(INNstring.Substring(8,1))) % 11) % 10);
  29.         }
  30.         catch { return false; }
  31.  
  32.         if (Int32.Parse(INNstring.Substring(9,1)) == dgt10) { return true; }
  33.         else { return false; }
  34.     }
  35.     else // для физического лица
  36.     {
  37.         int dgt11 = 0, dgt12 = 0;
  38.         try
  39.         {
  40.             dgt11 = (((
  41.                 7 * Int32.Parse(INNstring.Substring(0,1))
  42.                 + 2 * Int32.Parse(INNstring.Substring(1,1))
  43.                 + 4 * Int32.Parse(INNstring.Substring(2,1))
  44.                 + 10 * Int32.Parse(INNstring.Substring(3,1))
  45.                 + 3 * Int32.Parse(INNstring.Substring(4,1))
  46.                 + 5 * Int32.Parse(INNstring.Substring(5,1))
  47.                 + 9 * Int32.Parse(INNstring.Substring(6,1))
  48.                 + 4 * Int32.Parse(INNstring.Substring(7,1))
  49.                 + 6 * Int32.Parse(INNstring.Substring(8,1))
  50.                 + 8 * Int32.Parse(INNstring.Substring(9,1))) % 11) % 10);
  51.             dgt12 = (((
  52.                 3 * Int32.Parse(INNstring.Substring(0,1))
  53.                 + 7 * Int32.Parse(INNstring.Substring(1,1))
  54.                 + 2 * Int32.Parse(INNstring.Substring(2,1))
  55.                 + 4 * Int32.Parse(INNstring.Substring(3,1))
  56.                 + 10 * Int32.Parse(INNstring.Substring(4,1))
  57.                 + 3 * Int32.Parse(INNstring.Substring(5,1))
  58.                 + 5 * Int32.Parse(INNstring.Substring(6,1))
  59.                 + 9 * Int32.Parse(INNstring.Substring(7,1))
  60.                 + 4 * Int32.Parse(INNstring.Substring(8,1))
  61.                 + 6 * Int32.Parse(INNstring.Substring(9,1))
  62.                 + 8 * Int32.Parse(INNstring.Substring(10,1))) % 11) % 10);
  63.         }
  64.         catch { return false; }
  65.         if (Int32.Parse(INNstring.Substring(10,1)) == dgt11
  66.             && Int32.Parse(INNstring.Substring(11,1)) == dgt12) { return true; }
  67.         else { return false; }
  68.     }
  69. }

КПП

  1. /// <summary>
  2. /// проверка КПП по регулярному выражению
  3. /// </summary>
  4. /// <param name="KPPstring">КПП для проверки</param>
  5. /// <returns>true - если проходит проверку, false - если не проходит проверку</returns>
  6. public bool check_KPP(string KPPstring)
  7. {
  8.     return new Regex(@"\d{4}[\dA-Z][\dA-Z]\d{3}").IsMatch(KPPstring);
  9. }

ОГРН

  1. /// <summary>
  2. /// проверка ОГРН по контрольной цифре
  3. /// </summary>
  4. /// <param name="OGRNstring">ОГРН для проверки</param>
  5. /// <returns>true - если проходит проверку, false - если не проходит проверку</returns>
  6. public bool check_OGRN(string OGRNstring)
  7. {
  8.     // является ли вообще числом
  9.     long number = 0;
  10.     try { number = Int64.Parse(OGRNstring); }
  11.     catch { return false; }
  12.  
  13.     // проверка на 13 и 15 цифр
  14.     if (OGRNstring.Length != 13 && OGRNstring.Length != 15) { return false; }
  15.  
  16.     // проверка по контрольным цифрам
  17.     if (OGRNstring.Length == 13) // для юридического лица
  18.     {
  19.         // остаток от деления
  20.         int num12 = (int)Math.Floor(((double)number / 10) % 11);
  21.         int dgt13 = -1;
  22.         // если остаток равен 10, то берём 0, если нет, то берём его самого
  23.         if (num12 == 10) { dgt13 = 0; } else { dgt13 = num12; }
  24.         // ну и теперь сравниваем с контрольной цифрой
  25.         if (Int32.Parse(OGRNstring.Substring(12, 1)) == dgt13) { return true; }
  26.         else { return false; }
  27.     }
  28.     else // для индивидуального предпринимателя
  29.     {
  30.         // остаток от деления
  31.         int num14 = (int)Math.Floor(((double)number / 10) % 13);
  32.         int dgt15 = num14 % 10;
  33.         // ну и теперь сравниваем с контрольной цифрой
  34.         if (Int32.Parse(OGRNstring.Substring(14, 1)) == dgt15) { return true; }
  35.         else { return false; }
  36.     }
  37. }

Готовое приложение

В процессе написания случайно получилось готовое приложение (под Windows, конечно):

Validations screen.png

JavaScript

Допустим, есть какая-то веб-страница с формой, где присутствуют поля ИНН, КПП и ОГРН. Чтобы не дёргать сервер по мелочам, можно выполнить валидацию этих полей с помощью JavaScript, повесив на какой-нибудь onclick, например, следующие функции.

ИНН

  1. function isINNvalid(sender, args) {
  2.     // проверка на число
  3.     if (args.Value.match(/\D/)) {
  4.         //alert("Введённый ИНН не является числом");
  5.         args.IsValid = false;
  6.         return args.IsValid;
  7.     }
  8.     // проверка на 10 и 12 цифр
  9.     if (args.Value.length != 12 && args.Value.length != 10) {
  10.         args.IsValid = false;
  11.         return args.IsValid;
  12.     }
  13.     // проверка по контрольным цифрам
  14.     if (args.Value.length == 10) {
  15.         var dgt10 = String(((
  16.             2 * args.Value[0] + 4 * args.Value[1] + 10 * args.Value[2] +
  17.             3 * args.Value[3] + 5 * args.Value[4] + 9 * args.Value[5] +
  18.             4 * args.Value[6] + 6 * args.Value[7] + 8 * args.Value[8]) % 11) % 10);
  19.         if (args.Value[9] == dgt10) {
  20.             args.IsValid = true;
  21.             return args.IsValid;
  22.         }
  23.         else {
  24.             //alert("Введённый ИНН не прошёл проверку по контрольным цифрам");
  25.             args.IsValid = false;
  26.             return args.IsValid;
  27.         }
  28.     }
  29.     if (args.Value.length == 12) {
  30.         var dgt11 = String(((
  31.             7 * args.Value[0] + 2 * args.Value[1] + 4 * args.Value[2] +
  32.             10 * args.Value[3] + 3 * args.Value[4] + 5 * args.Value[5] +
  33.             9 * args.Value[6] + 4 * args.Value[7] + 6 * args.Value[8] +
  34.             8 * args.Value[9]) % 11) % 10);
  35.         var dgt12 = String(((
  36.             3 * args.Value[0] + 7 * args.Value[1] + 2 * args.Value[2] +
  37.             4 * args.Value[3] + 10 * args.Value[4] + 3 * args.Value[5] +
  38.             5 * args.Value[6] + 9 * args.Value[7] + 4 * args.Value[8] +
  39.             6 * args.Value[9] + 8 * args.Value[10]) % 11) % 10);
  40.         if (args.Value[10] == dgt11 && args.Value[11] == dgt12)
  41.         {
  42.             args.IsValid = true;
  43.             return args.IsValid;
  44.         }
  45.         else {
  46.             //alert("Введённый ИНН не прошёл проверку по контрольным цифрам");
  47.             args.IsValid = false;
  48.             return args.IsValid;
  49.         }
  50.     }
  51. }

КПП

  1. function isKPPvalid(sender, args) {
  2.     if (args.Value.length != 9) {
  3.         //alert("КПП должен представлять собой девятизначный код");
  4.         args.IsValid = false;
  5.         return args.IsValid;
  6.     }
  7.     if (!args.Value.match(/\d{4}[\dA-Z][\dA-Z]\d{3}/)) {
  8.         //alert("КПП не соответствует формату");
  9.         args.IsValid = false;
  10.         return args.IsValid;
  11.     }
  12.     else {
  13.         args.IsValid = true;
  14.         return args.IsValid;
  15.     }
  16. }

ОГРН

  1. function isOGRNvalid(sender, args) {
  2.     // проверка на число
  3.     if (args.Value.match(/\D/)) {
  4.         //alert("Введённый ОГРН не является числом");
  5.         args.IsValid = false;
  6.         return args.IsValid;
  7.     }
  8.     // проверка на 13 и 15 цифр
  9.     if (args.Value.length != 13 && args.Value.length != 15) {
  10.         args.IsValid = false;
  11.         return args.IsValid;
  12.     }
  13.     // проверка ОГРН для ЮЛ
  14.     if (args.Value.length == 13) {
  15.         // проверка по контрольным цифрам
  16.         var num12 = args.Value;
  17.         num12 = Math.floor((num12 / 10) % 11);
  18.         if (num12 == 10) { dgt13 = 0; }
  19.         else { dgt13 = num12; }
  20.         if (args.Value[12] == dgt13) {
  21.             args.IsValid = true;
  22.             return args.IsValid;
  23.         }
  24.         else {
  25.             //alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");
  26.             args.IsValid = false;
  27.             return args.IsValid;
  28.         }
  29.     }
  30.     // проверка ОГРН для ИП
  31.     if (args.Value.length == 15) {
  32.         // проверка по контрольным цифрам
  33.         var num14 = args.Value;
  34.         num14 = Math.floor((num14 / 10) % 13);
  35.         if (num14 == 10) { dgt15 = 0; }
  36.         else { dgt15 = num14; }
  37.         if (args.Value[14] == dgt15) {
  38.             args.IsValid = true;
  39.             return args.IsValid;
  40.         }
  41.         else {
  42.             //alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");
  43.             args.IsValid = false;
  44.             return args.IsValid;
  45.         }
  46.     }
  47. }