LINUX.ORG.RU

Может, кому пригодиться :-)


0

0

Простенькая реализация проверки корректности ИНН - выдрано из чужих
PL/SQL'евских сорцов и "лоб в лоб" перенесено на C. Есть еще "порт"
на Visual Basic в Excel, но это уж совсем оффтопик :-)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv) {

    int i;
    int buf;
    int len;
    int cnst[11];
    char inn_to_check[13];
    
    if (argc!=2) {
        fprintf (stderr,"Use: %s <inn_number>\n",argv[0]);
        return 4;
    }
    
    if ((strlen(argv[1])!=10)&&(strlen(argv[1])!=12)) {
        fprintf (stderr,"Bad INN - length must be 10 or 12 digits\n");
        return 3;
    }
    
    for (i=0;i<strlen(argv[1]);i++) {
        if ((argv[1][i]<'0')||(argv[1][i]>'9')) {
            fprintf (stderr,"Bad INN - it contains non-digital symbols\n");
            return 2;
        }
    }
    
    cnst[0] = 3;
    cnst[1] = 7;
    cnst[2] = 2;
    cnst[3] = 4;
    cnst[4] = 10;
    cnst[5] = 3;
    cnst[6] = 5;
    cnst[7] = 9;
    cnst[8] = 4;
    cnst[9] = 6;
    cnst[10] = 8;
    
    strcpy ( inn_to_check, argv[1] );
    len = strlen ( inn_to_check );
    
    if (len == 10) {
        buf = 0;
        for (i=0 ; i < len-1 ; i++) {
            buf += (inn_to_check[i]-'0') * cnst[2+i];
        }
        buf = (buf % 11) % 10;
        if (inn_to_check[len-1] != ('0'+buf)) {
            fprintf (stderr,"Bad INN:10 - checksum doesn't match\n");
            return 1;
        }
    } else {
        buf = 0;
        len=11;
        for (i=0 ; i < len-1 ; i++) {
            buf += (inn_to_check[i]-'0') * cnst[1+i];
        }
        buf = (buf % 11) % 10;
        if (inn_to_check[len-1] != ('0'+buf)) {
            fprintf (stderr,"Bad INN:12 - checksum doesn't match on level 1\n");
            return 1;
        }

        buf = 0;
        len=12;
        for (i=0 ; i < len-1 ; i++) {
            buf += (inn_to_check[i]-'0') * cnst[i];
        }
        buf = (buf % 11) % 10;
        if (inn_to_check[len-1] != ('0'+buf)) {
            fprintf (stderr,"Bad INN:12 - checksum doesn't match on level 2\n");
            return 1;
        }
    }

    printf ("INN is good\n");    
    return 0;
}
★★★★★

Спасибо. Возможно, пригодится.

Obidos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.