Проверка корректности ИНН. Алгоритм и реализация на PHP.
Введенный ИНН 00000000000 - Ошибочен
Данная проверка не может гарантировать существование ИНН, она может указать на ошибку в ИНН, например при добавление в базу.
Функция проверки 10 и 12 значных ИНН на PHP
function TestINN($inn)
{
$i = (string)$inn;
if ( !preg_match('/^\d*$/',$i) )
return false;
if ( strlen($i)==10 )
{
$s = (2*$i{0}+4*$i{1}+10*$i{2}+3*$i{3}+5*$i{4}+9*$i{5}+4*$i{6}+6*$i{7}+8*$i{8})%11;
if ( $s==10 )
$s = 0;
if ( $s==$i{9} )
return true;
else return false;
}
if ( strlen($i)==12 )
{
$s = (7*$i{0}+2*$i{1}+4*$i{2}+10*$i{3}+3*$i{4}+5*$i{5}+9*$i{6}+4*$i{7}+6*$i{8}+8*$i{9})%11;
if ( $s==10 )
$s = 0;
$s2 = (3*$i{0}+7*$i{1}+2*$i{2}+4*$i{3}+10*$i{4}+3*$i{5}+5*$i{6}+9*$i{7}+4*$i{8}+6*$i{9}+8*$i{10})%11;
if ( $s2==10 )
$s2 = 0;
if ( $s==$i{10} and $s2==$i{11} )
return true;
else return false;
}
return false;
}
Алгоритм проверки ИНН
Проверка 10 значного ИНН (1 контрольна цифра в конце)
Для примера возьмем 10 значный ИНН 1234567890
Последнее, 10-тое число ( 0 ) является контрольным. Если результаты расчета совпадут с контрольной цифрой - значит такой ИНН корректен.
1) Для расчета контрольного числа следует умножить каждый разряд ИНН (кроме последнего контрольного разряда) на следующие цифры:
- 1 разряд умножить на 2; для нашего примера 1*2 = 2;
- 2 разряд умножить на 4; для нашего примера 2*4 = 8;
- 3 разряд умножить на 10; для нашего примера 3*10 = 30;
- 4 разряд умножить на 3; для нашего примера 4*3 = 12;
- 5 разряд умножить на 5; для нашего примера 5*5 = 25;
- 6 разряд умножить на 9; для нашего примера 6*9 = 54;
- 7 разряд умножить на 4; для нашего примера 7*4 = 28;
- 8 разряд умножить на 6; для нашего примера 8*6 = 48;
- 9 разряд умножить на 8; для нашего примера 9*8 = 72;
- 10 разряд контрольный, его ни на что умножать не надо.
2) Просуммируем получившиеся числа. Для нашего примера получиться: 2+8+30+12+25+54+28+48+72=279
3) Следующий шаг: получаем остаток от деления на число 11. Для нашего примера это 279/11 остаток 4
3а) Если остаток от деления равен 10, то считать что остаток от деления равен 0.
4) Если полученный остаток равен последней цифре, то ИНН корректен. В нашем примере: полученный остаток 4 не равен последней цифре 0, значит такого ИНН быть не может, просим проверить правильность ввода.
Проверка 12 значного ИНН (2 контрольные цифры)
Для проверки 12 значного ИНН, требуется вычислить 2 контрольных числа. Алгоритм расчета такой же, как у 10 значного ИНН. Различаются лишь веса разрядов.
Для примера возьмем 12 значный ИНН 123456789012
Последние, 11-тое и 12-тое числа ( 1 и 2 ) являются контрольными. Если результаты расчета совпадут с контрольными цифрами - значит такой ИНН корректен.
1-1) Для расчета первого контрольного числа (11-тое по счету 1) умножаем разряды ИНН на следующие цифры
- 1 разряд умножить на 7; для нашего примера 1*7 = 7;
- 2 разряд умножить на 2; для нашего примера 2*2 = 4;
- 3 разряд умножить на 4; для нашего примера 3*4 = 12;
- 4 разряд умножить на 10; для нашего примера 4*10 = 40;
- 5 разряд умножить на 3; для нашего примера 5*3 = 15;
- 6 разряд умножить на 5; для нашего примера 6*5 = 30;
- 7 разряд умножить на 9; для нашего примера 7*9 = 63;
- 8 разряд умножить на 4; для нашего примера 8*4 = 32;
- 9 разряд умножить на 6; для нашего примера 9*6 = 54;
- 10 разряд умножить на 8; для нашего примера 0*8 = 0;
- 11 разряд контрольный, его ни на что умножать не надо.
- 12 разряд контрольный, его ни на что умножать не надо.
1-2) Просуммируем получившиеся числа. Для нашего примера получиться: 7+4+12+40+15+30+63+32+54+0=257
1-3) Следующий шаг: получаем остаток от деления на число 11. Для нашего примера это 257/11 остаток 4
1-3а) Если остаток от деления равен 10, то считать что остаток от деления равен 0.
1-4) Если полученный остаток равен 11-той цифре, то проверяем следующую контрольную цифру. В нашем примере: полученный остаток 4 не равен 11-той цифре 1, значит такого ИНН быть не может, просим проверить правильность ввода. Но для примера проверим и следующее контрольное число.
2-1) Для расчета второго контрольного числа (12-тое по счету 2) умножаем разряды ИНН на следующие цифры
- 1 разряд умножить на 3; для нашего примера 1*3 = 3;
- 2 разряд умножить на 7; для нашего примера 2*7 = 14;
- 3 разряд умножить на 2; для нашего примера 3*2 = 6;
- 4 разряд умножить на 4; для нашего примера 4*4 = 16;
- 5 разряд умножить на 10; для нашего примера 5*10 = 50;
- 6 разряд умножить на 3; для нашего примера 6*3 = 18;
- 7 разряд умножить на 5; для нашего примера 7*5 = 35;
- 8 разряд умножить на 9; для нашего примера 8*9 = 72;
- 9 разряд умножить на 4; для нашего примера 9*4 = 36;
- 10 разряд умножить на 6; для нашего примера 0*6 = 0;
- 11 разряд умножить на 8; для нашего примера 1*8 = 8;
(хоть это и контрольный разряд, но он учитывается для получения второго контрольного числа) - 12 разряд контрольный, его ни на что умножать не надо.
2-2) Просуммируем получившиеся числа. Для нашего примера получиться: 3+14+6+16+50+18+35+72+36+0+8=258
2-3) Следующий шаг: получаем остаток от деления на число 11. Для нашего примера это 258/11 остаток 5
2-3а) Если остаток от деления равен 10, то считать что остаток от деления равен 0.
2-4) Если полученный остаток равен 12-той цифре, и на предыдущем этапе было равенство контрольного числа то ИНН корректен. В нашем примере: полученный остаток 5 не равен 12-той цифре 2, значит такого ИНН быть не может, просим проверить правильность ввода.