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

Материал из Кафедра ИУ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#

ИНН

        /// <summary>
        /// Проверка Inn по контрольной сумме.
        /// </summary>
        public bool CheckInn(string innString) {
            try {
                // является ли вообще числом
                long num;
                if (!long.TryParse(innString, out num)) {
                    return false;
                }
                int[] numArray = Array.ConvertAll(innString.ToCharArray(), input => (int)char.GetNumericValue(input));
                // проверка по контрольным цифрам
                if (numArray.Length == 10) {
                    // для юридического лица
                    return numArray[9] ==
                           (
                               (
                                   (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])
                                   % 11)
                               % 10);
                }
                if (numArray.Length == 12) {
                    return numArray[10] == (((
                        7 * numArray[0]
                        + 2 * numArray[1]
                        + 4 * numArray[2]
                        + 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;
        }

КПП

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

ОГРН

/// <summary>
/// проверка ОГРН по контрольной цифре
/// </summary>
/// <param name="OGRNstring">ОГРН для проверки</param>
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns>
public bool check_OGRN(string OGRNstring)
{
    // является ли вообще числом
    long number = 0;
    try { number = Int64.Parse(OGRNstring); }
    catch { return false; }

    // проверка на 13 и 15 цифр
    if (OGRNstring.Length != 13 && OGRNstring.Length != 15) { return false; }

    // проверка по контрольным цифрам
    if (OGRNstring.Length == 13) // для юридического лица
    {
        // остаток от деления
        int num12 = (int)Math.Floor(((double)number / 10) % 11);
        int dgt13 = -1;
        // если остаток равен 10, то берём 0, если нет, то берём его самого
        if (num12 == 10) { dgt13 = 0; } else { dgt13 = num12; }
        // ну и теперь сравниваем с контрольной цифрой
        if (Int32.Parse(OGRNstring.Substring(12, 1)) == dgt13) { return true; }
        else { return false; }
    }
    else // для индивидуального предпринимателя
    {
        // остаток от деления
        int num14 = (int)Math.Floor(((double)number / 10) % 13);
        int dgt15 = num14 % 10;
        // ну и теперь сравниваем с контрольной цифрой
        if (Int32.Parse(OGRNstring.Substring(14, 1)) == dgt15) { return true; }
        else { return false; }
    }
}

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

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

JavaScript

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

ИНН

function isINNvalid(sender, args) {
    // проверка на число
    if (args.Value.match(/\D/)) {
        //alert("Введённый ИНН не является числом");
        args.IsValid = false;
        return args.IsValid;
    }
    // проверка на 10 и 12 цифр
    if (args.Value.length != 12 && args.Value.length != 10) {
        args.IsValid = false;
        return args.IsValid;
    }
    // проверка по контрольным цифрам
    if (args.Value.length == 10) {
        var dgt10 = String(((
            2 * args.Value[0] + 4 * args.Value[1] + 10 * args.Value[2] +
            3 * args.Value[3] + 5 * args.Value[4] + 9 * args.Value[5] +
            4 * args.Value[6] + 6 * args.Value[7] + 8 * args.Value[8]) % 11) % 10);
        if (args.Value[9] == dgt10) {
            args.IsValid = true;
            return args.IsValid;
        }
        else {
            //alert("Введённый ИНН не прошёл проверку по контрольным цифрам");
            args.IsValid = false;
            return args.IsValid;
        }
    }
    if (args.Value.length == 12) {
        var dgt11 = String(((
            7 * args.Value[0] + 2 * args.Value[1] + 4 * args.Value[2] +
            10 * args.Value[3] + 3 * args.Value[4] + 5 * args.Value[5] +
            9 * args.Value[6] + 4 * args.Value[7] + 6 * args.Value[8] +
            8 * args.Value[9]) % 11) % 10);
        var dgt12 = String(((
            3 * args.Value[0] + 7 * args.Value[1] + 2 * args.Value[2] +
            4 * args.Value[3] + 10 * args.Value[4] + 3 * args.Value[5] +
            5 * args.Value[6] + 9 * args.Value[7] + 4 * args.Value[8] +
            6 * args.Value[9] + 8 * args.Value[10]) % 11) % 10);
        if (args.Value[10] == dgt11 && args.Value[11] == dgt12)
        {
            args.IsValid = true;
            return args.IsValid;
        }
        else {
            //alert("Введённый ИНН не прошёл проверку по контрольным цифрам");
            args.IsValid = false;
            return args.IsValid;
        }
    }
}

КПП

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

ОГРН

function isOGRNvalid(sender, args) {
    // проверка на число
    if (args.Value.match(/\D/)) {
        //alert("Введённый ОГРН не является числом");
        args.IsValid = false;
        return args.IsValid;
    }
    // проверка на 13 и 15 цифр
    if (args.Value.length != 13 && args.Value.length != 15) {
        args.IsValid = false;
        return args.IsValid;
    }
    // проверка ОГРН для ЮЛ
    if (args.Value.length == 13) {
        // проверка по контрольным цифрам
        var num12 = args.Value;
        num12 = Math.floor((num12 / 10) % 11);
        if (num12 == 10) { dgt13 = 0; }
        else { dgt13 = num12; }
        if (args.Value[12] == dgt13) {
            args.IsValid = true;
            return args.IsValid;
        }
        else {
            //alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");
            args.IsValid = false;
            return args.IsValid;
        }
    }
    // проверка ОГРН для ИП
    if (args.Value.length == 15) {
        // проверка по контрольным цифрам
        var num14 = args.Value;
        num14 = Math.floor((num14 / 10) % 13);
        var dgt15 = num14 % 10;
        if (args.Value[14] == dgt15) {
            args.IsValid = true;
            return args.IsValid;
        }
        else {
            //alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");
            args.IsValid = false;
            return args.IsValid;
        }
    }
}