segunda-feira, 3 de outubro de 2011

Validador de Código de Barras (EAN)


function IsEan(CodigoEan : String) : Boolean;
var
  CheckSum, DigitoOrig : String;
  i, Digito, Longitud  : Integer;
begin
  Longitud := Length(CodigoEan);
 
  // Comprobar que no hay menos o más caracteres de los permitidos (8 ó 13)
  if not ((Longitud <> 8) and (Longitud <> 13)) then
  begin
    // Obtener el d&iacute;gito de control leido en un principio
    DigitoOrig := Copy(CodigoEan, Longitud, 1);
 
    // Quitar el d&iacute;gito de control que se ha obtenido en la lectura para procesar
    // el c&oacute;digo de barras y verificar su correcta lectura.
    CodigoEan := Copy(CodigoEan, 1, Longitud - 1);
 
    CheckSum := '131313131313';
 
    Digito := 0;
 
    for i := 1 to Longitud - 1 do
      Digito := Digito + (StrToInt(Copy(CodigoEan, i, 1)) * StrToInt(Copy(CheckSum, i, 1)));
 
    // Extraer el valor de la derecha.
    Digito := StrToInt(Copy(IntToStr(Digito), Length(IntToStr(Digito)),1));
 
    // Restarlo de 10 si es mayor o igual que 10.
    if Digito > 9 then
      Digito := 10 - Digito;
 
    // Comparar d&iacute;gito de control original con el obtenido y devolver un resultado.
    Result := (Digito = StrToInt(DigitoOrig));
  end
  else
    Result := False;
end;

2 comentários:

  1. 7896773900882
    7896773900899
    Nesse tipo de codigo ele tem um bug, que ainda não encontrei

    ResponderExcluir
  2. Conseguir a solução e so substituir o
    if Digito > 9 then Digito := 10 - Digito;
    para
    if Digito > 0 then Digito := 10 - Digito;

    Valeu!

    ResponderExcluir