Funcao - calculo de modulo 10

Top  Previous  Next

// o calculo do módulo 10 é o seguinte:

// os multiplicadores iniciam com 2 sempre pela direita alternando-se entre 1 e 2

// deve-se multiplicar cada algarismo que compoe o numero pelo seu respectivo peso multiplicador (1 ou 2)

// caso o resultado da multiplicacao seja maior que 9, deverao ser somados os algarismos do produto até reduzi-lo a um unico algarismo

// subtrair o total apurado da dezena imediatamente superior ao total apudado: se a soma deu 25 faça 30 - 25 = 5

// o resultado obtido sera o digito verificador, se o resultado da subtração for 10 o dígito verificador é zero

// exemplo:

// o número 29004590 tem como d.v.: 6 -> (0*2) + (9*1) + (5*2)           + (4*1) + (0*2) + (0*1) + (9*2)          + (2*1)

//                                        0    +  9    +  10 = 1 + 0 = 1 +  4    +  0    +  0    + 18 = 1 + 8 = 9 +  2

//                                        25.   30 - 25 = 5  <<-- Digito Verificador é 5

function CalcModulo10(const Codigo: string): string;

var

  I, Mult, SubTot, Tot: Integer; // I = usado no for, Mult = alterna entre 1 e 2, SubTot é o produto multiplicado, e Tot = somatorio

begin

  Tot := 0; Mult:= 2;

  // percorre o código de barras

  for I := Length(Codigo) downto 1 do

  begin

    SubTot := Mult * StrToInt(Codigo[I]);      // faz a multiplicacao

    while SubTot > 9 do                        // enquanto tem 2 algarismos soma os mesmos

      SubTot := StrToInt(IntToStr(SubTot)[1]) + StrToInt(IntToStr(SubTot)[2]);

    Tot := Tot + SubTot;                       // acrescenta o valor ao tot

    if Mult = 2 then Mult := 1 else Mult := 2// troca o multiplicador

  end;

  SubTot := Tot;

 

  // se div por 10 não sobra nada, incrementa 10

  if SubTot mod 10 = 0 then

    Inc(SubTot,10)

  else // senão enquando não achar a dezena posterior ao SubTot vai incrementando

    while (SubTot mod 10) <> 0 do Inc(SubTot);

 

  Tot := SubTot - Tot;        // pega o dígito verificador

  if Tot = 10 then Tot := 0;  // se ele for 10 retorna ZERO

  Result := IntToStr(Tot);

end;