Показать сообщение отдельно
Старый 15.12.2002, 11:44   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Функция проверки контрольного числа ИНН
Недавно узнал, что ИНН это оказывается не просто уникальная последовательность цифр, но и последовательность сгенерированная по определенным правилам.
Идея не моя - взял здесь: http://www.delphikingdom.com/treasury/inn_pf.htm
Я всего лишь перевел код с Дельфи на X++.

Все это дело оформлено в виде функции. Функция вычисляет контрольное число ИНН и возвращает true если ИНН введен правильно или false в противном случае.
В качестве параметра передается проверяемый ИНН:


PHP код:
 boolean checkINN(str INN)
    {
      
int factor1[9];
      
int factor2[10];
      
int factor3[11];
      
int smsm2;
      
int i;

      
factor1[1] = 2;    factor1[2] = 4;    factor1[3] = 10;    factor1[4] = 3;     factor1[5] = 5;
      
factor1[6] = 9;    factor1[7] = 4;    factor1[8] = 6;     factor1[9] = 8;

      
factor2[1] = 7;    factor2[2] = 2;    factor2[3] = 4;     factor2[4] = 10;    factor2[5]  = 3;
      
factor2[6] = 5;    factor2[7] = 9;    factor2[8] = 4;     factor2[9] = 6;     factor2[10] = 8;

      
factor3[1]  = 3;    factor3[2] = 7;    factor3[3] = 2;     factor3[4] = 4;    factor3[5]  = 10;
      
factor3[6]  = 3;    factor3[7] = 5;    factor3[8] = 9;     factor3[9] = 4;    factor3[10] = 6;
      
factor3[11] = 8;


      if (
strlen(INN) == 10)
      {
        
sm 0;
        for (
i=1i<10i++)
          
sm sm str2int(substr(INN,i,1))*factor1[i];
        
sm sm mod 11;
        
sm sm mod 10;
        if (
str2int(substr(INN,10,1)) == sm) return true;
                                      else   return 
false;
      }
      else if (
strlen(INN) == 12)
      {
        
sm 0;
        for (
i=1i<11i++)
          
sm sm str2int(substr(INN,i,1))*factor2[i];
        
sm sm mod 11;
        
sm sm mod 10;

        
sm2 0;
        for (
i=1i<12i++)
          
sm2 sm2 str2int(substr(INN,i,1))*factor3[i];
        
sm2 sm2 mod 11;
        
sm2 sm2 mod 10;
        if ((
str2int(substr(INN,11,1)) == sm) && (str2int(substr(INN,12,1)) == sm2)) return true;
                      else return 
false;
      }
      else return 
false;
    } 
Кстати, неужели в Аксапте нет более удобного способа инициализировать массивы ?