Проверка ИНН, КПП и ОГРН — различия между версиями

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана - студенческое сообщество
Перейти к: навигация, поиск
(ИНН)
(ИНН: Привел код в порядок.)
Строка 19: Строка 19:
  
 
<syntaxhighlight line lang="csharp">
 
<syntaxhighlight line lang="csharp">
/// <summary>
+
        /// <summary>
/// проверка ИНН по контрольной цифре
+
        /// Проверка Inn по контрольной сумме.
/// </summary>
+
        /// </summary>
/// <param name="INNstring">ИНН для проверки</param>
+
        public bool CheckInn(string innString) {
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns>
+
            try {
public bool check_INN(string INNstring)
+
                // является ли вообще числом
{
+
                long num;
    // является ли вообще числом
+
                if (!long.TryParse(innString, out num)) {
    try { Int64.Parse(INNstring); } catch { return false; }
+
                    return false;
 
+
                }
    // проверка на 10 и 12 цифр
+
                int[] numArray = Array.ConvertAll(innString.ToCharArray(), input => (int)char.GetNumericValue(input));
    if (INNstring.Length != 10 && INNstring.Length != 12) { return false; }
+
                // проверка по контрольным цифрам
 
+
                if (numArray.Length == 10) {
    // проверка по контрольным цифрам
+
                    // для юридического лица
    if (INNstring.Length == 10) // для юридического лица
+
                    return numArray[9] ==
    {
+
                          (
        int dgt10 = 0;
+
                              (
        try
+
                                  (2 * numArray[0] + 4 * numArray[1] + 10 * numArray[2] + 3 * numArray[3]
        {
+
                                    + 5 * numArray[4] + 9 * numArray[5] + 4 * numArray[6] + 6 * numArray[7] + 8 * numArray[8])
            dgt10 = (((2 * Int32.Parse(INNstring.Substring(0,1))
+
                                  % 11)
                + 4 * Int32.Parse(INNstring.Substring(1,1))
+
                              % 10);
                + 10 * Int32.Parse(INNstring.Substring(2,1))
+
                 }
                + 3 * Int32.Parse(INNstring.Substring(3,1))
+
                if (numArray.Length == 12) {
                + 5 * Int32.Parse(INNstring.Substring(4,1))
+
                    return numArray[10] == (((
                 + 9 * Int32.Parse(INNstring.Substring(5,1))
+
                        7 * numArray[0]
                + 4 * Int32.Parse(INNstring.Substring(6,1))
+
                        + 2 * numArray[1]
                + 6 * Int32.Parse(INNstring.Substring(7,1))
+
                        + 4 * numArray[2]
                + 8 * Int32.Parse(INNstring.Substring(8,1))) % 11) % 10);
+
                        + 10 * numArray[3]
 +
                        + 3 * numArray[4]
 +
                        + 5 * numArray[5]
 +
                        + 9 * numArray[6]
 +
                        + 4 * numArray[7]
 +
                        + 6 * numArray[8]
 +
                        + 8 * numArray[9]) % 11) % 10)
 +
                    &&
 +
                      numArray[11] == (((
 +
                        3 * numArray[0]
 +
                        + 7 * numArray[1]
 +
                        + 2 * numArray[2]
 +
                        + 4 * numArray[3]
 +
                        + 10 * numArray[4]
 +
                        + 3 * numArray[5]
 +
                        + 5 * numArray[6]
 +
                        + 9 * numArray[7]
 +
                        + 4 * numArray[8]
 +
                        + 6 * numArray[9]
 +
                        + 8 * numArray[10]) % 11) % 10);
 +
                }
 +
            } catch {
 +
                //logger
 +
            }
 +
            return false;
 
         }
 
         }
        catch { return false; }
 
 
        if (Int32.Parse(INNstring.Substring(9,1)) == dgt10) { return true; }
 
        else { return false; }
 
    }
 
    else // для физического лица
 
    {
 
        int dgt11 = 0, dgt12 = 0;
 
        try
 
        {
 
            dgt11 = (((
 
                7 * Int32.Parse(INNstring.Substring(0,1))
 
                + 2 * Int32.Parse(INNstring.Substring(1,1))
 
                + 4 * Int32.Parse(INNstring.Substring(2,1))
 
                + 10 * Int32.Parse(INNstring.Substring(3,1))
 
                + 3 * Int32.Parse(INNstring.Substring(4,1))
 
                + 5 * Int32.Parse(INNstring.Substring(5,1))
 
                + 9 * Int32.Parse(INNstring.Substring(6,1))
 
                + 4 * Int32.Parse(INNstring.Substring(7,1))
 
                + 6 * Int32.Parse(INNstring.Substring(8,1))
 
                + 8 * Int32.Parse(INNstring.Substring(9,1))) % 11) % 10);
 
            dgt12 = (((
 
                3 * Int32.Parse(INNstring.Substring(0,1))
 
                + 7 * Int32.Parse(INNstring.Substring(1,1))
 
                + 2 * Int32.Parse(INNstring.Substring(2,1))
 
                + 4 * Int32.Parse(INNstring.Substring(3,1))
 
                + 10 * Int32.Parse(INNstring.Substring(4,1))
 
                + 3 * Int32.Parse(INNstring.Substring(5,1))
 
                + 5 * Int32.Parse(INNstring.Substring(6,1))
 
                + 9 * Int32.Parse(INNstring.Substring(7,1))
 
                + 4 * Int32.Parse(INNstring.Substring(8,1))
 
                + 6 * Int32.Parse(INNstring.Substring(9,1))
 
                + 8 * Int32.Parse(INNstring.Substring(10,1))) % 11) % 10);
 
        }
 
        catch { return false; }
 
        if (Int32.Parse(INNstring.Substring(10,1)) == dgt11
 
            && Int32.Parse(INNstring.Substring(11,1)) == dgt12) { return true; }
 
        else { return false; }
 
    }
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Версия 11:53, 15 января 2016

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

Теория

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

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

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

Практика

C#

ИНН

  1.         /// <summary>
  2.         /// Проверка Inn по контрольной сумме.
  3.         /// </summary>
  4.         public bool CheckInn(string innString) {
  5.             try {
  6.                 // является ли вообще числом
  7.                 long num;
  8.                 if (!long.TryParse(innString, out num)) {
  9.                     return false;
  10.                 }
  11.                 int[] numArray = Array.ConvertAll(innString.ToCharArray(), input => (int)char.GetNumericValue(input));
  12.                 // проверка по контрольным цифрам
  13.                 if (numArray.Length == 10) {
  14.                     // для юридического лица
  15.                     return numArray[9] ==
  16.                            (
  17.                                (
  18.                                    (2 * numArray[0] + 4 * numArray[1] + 10 * numArray[2] + 3 * numArray[3]
  19.                                     + 5 * numArray[4] + 9 * numArray[5] + 4 * numArray[6] + 6 * numArray[7] + 8 * numArray[8])
  20.                                    % 11)
  21.                                % 10);
  22.                 }
  23.                 if (numArray.Length == 12) {
  24.                     return numArray[10] == (((
  25.                         7 * numArray[0]
  26.                         + 2 * numArray[1]
  27.                         + 4 * numArray[2]
  28.                         + 10 * numArray[3]
  29.                         + 3 * numArray[4]
  30.                         + 5 * numArray[5]
  31.                         + 9 * numArray[6]
  32.                         + 4 * numArray[7]
  33.                         + 6 * numArray[8]
  34.                         + 8 * numArray[9]) % 11) % 10)
  35.                     &&
  36.                        numArray[11] == (((
  37.                         3 * numArray[0]
  38.                         + 7 * numArray[1]
  39.                         + 2 * numArray[2]
  40.                         + 4 * numArray[3]
  41.                         + 10 * numArray[4]
  42.                         + 3 * numArray[5]
  43.                         + 5 * numArray[6]
  44.                         + 9 * numArray[7]
  45.                         + 4 * numArray[8]
  46.                         + 6 * numArray[9]
  47.                         + 8 * numArray[10]) % 11) % 10);
  48.                 }
  49.             } catch {
  50.                 //logger
  51.             }
  52.             return false;
  53.         }

КПП

  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.         var dgt15 = num14 % 10;
  36.         if (args.Value[14] == dgt15) {
  37.             args.IsValid = true;
  38.             return args.IsValid;
  39.         }
  40.         else {
  41.             //alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");
  42.             args.IsValid = false;
  43.             return args.IsValid;
  44.         }
  45.     }
  46. }