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; |