Проверка ИНН, КПП и ОГРН: различия между версиями
(→ОГРН: косяк в проверке ОГРН ИП) |
(→ОГРН: косяк в проверке ОГРН ИП) |
||
Строка 272: | Строка 272: | ||
var num14 = args.Value; | var num14 = args.Value; | ||
num14 = Math.floor((num14 / 10) % 13); | num14 = Math.floor((num14 / 10) % 13); | ||
int dgt15 = num14 % 10; | |||
if (args.Value[14] == dgt15) { | if (args.Value[14] == dgt15) { | ||
args.IsValid = true; | args.IsValid = true; |
Версия от 10:46, 6 декабря 2013
Что такое ИНН, КПП, ОГРН и как программно проверять их значения на корректность. Бонусом к статье идёт готовое приложение под Windows.
Теория
Сначала, что это такое:
- Идентификационный номер налогоплательщика (ИНН);
- Код причины постановки на учёт (КПП);
- Основной государственный регистрационный номер (ОГРН).
Вкратце, суть: эти значения (за исключением КПП) содержат контрольную цифру, по которой можно проверить их корректность. Контрольная цифра вычисляется по формуле, которую затруднительно посчитать в уме не отходя от кассы, потому надо поручить это компьютеру. С КПП всё проще - там просто соответствие регулярному выражению, но мы и это спихнём компу.
Ниже приведены программные решения этой задачи. Индусский код инклюдед.
Практика
C#
ИНН
/// <summary>
/// проверка ИНН по контрольной цифре
/// </summary>
/// <param name="INN">ИНН для проверки</param>
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns>
public bool check_INN(string INNstring)
{
// является ли вообще числом
try { Int64.Parse(INNstring); } catch { return false; }
// проверка на 10 и 12 цифр
if (INNstring.Length != 10 && INNstring.Length != 12) { return false; }
// проверка по контрольным цифрам
if (INNstring.Length == 10) // для юридического лица
{
int dgt10 = 0;
try
{
dgt10 = (((2 * Int32.Parse(INNstring.Substring(0,1))
+ 4 * Int32.Parse(INNstring.Substring(1,1))
+ 10 * Int32.Parse(INNstring.Substring(2,1))
+ 3 * Int32.Parse(INNstring.Substring(3,1))
+ 5 * Int32.Parse(INNstring.Substring(4,1))
+ 9 * Int32.Parse(INNstring.Substring(5,1))
+ 4 * Int32.Parse(INNstring.Substring(6,1))
+ 6 * Int32.Parse(INNstring.Substring(7,1))
+ 8 * Int32.Parse(INNstring.Substring(8,1))) % 11) % 10);
}
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; }
}
}
КПП
/// <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, конечно):
- само приложение (Требует .NET 4.5.1.);
- исходники проекта (MS Visual Studio 2013).

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