Validar un código de barras en EAN8 / EAN13  

Enviado Por: Pedro A. De Fuentes Quesada
Web : http://www.pedroq.da.ru/
Email: N.A.
Fecha: 19/04/01

Truco accedido 87 veces

 



 Function IsValidEAN(EANCode: String): Boolean;
 Var
   CheckSum1: String;
   Tmp, Tmp2: Integer;
   VerifyDigit: Integer;
   LectDigit: String;
 Begin
     // En principio, el valor por defecto en FALSE para IsValidEAN
     IsValidEAN := False;

     // Comprobar que no hay menos o más caracteres de los permitidos (8 ó 13)
     If ((Length(EANCode) <> 8) And (Length(EANCode) <> 13)) Then Exit;

     // Obtener el dígito de control leido en un principio
     LectDigit := Copy(EANCode, Length(EanCode), 1);

     // Quitar el dígito de control que se ha obtenido en la lectura para procesar
     // el código de barras y verificar su correcta lectura
     EANCode := Copy(EANCode, 1, Length(EanCode) - 1);

     CheckSum1 := '131313131313';

     Tmp2 := 0;

     For Tmp := 1 To Length(EANCode) do
      Begin
         Tmp2 := Tmp2 + (StrToInt (Copy (EANCode, Tmp, 1)) * StrToInt (Copy(CheckSum1, Tmp, 1)));
      End;

     // Extraer el valor de la derecha
     Tmp := StrToInt (Copy (IntToStr(Tmp2), Length(IntToStr(Tmp2)),1));

     // Restarlo de 10 si no es ya 0
     If Tmp > 0 Then Tmp := 10 - Tmp;

     // Almacenar el dígito de control obtenido
     VerifyDigit := Tmp;

     // Comparar dígito de control original con el obtenido y devolver un resultado
     If VerifyDigit <> StrToInt (LectDigit) Then
         IsValidEAN := False
     Else
         IsValidEAN := True;
 End;



Ejemplo de llamada:

 Procedure TForm1.Button1Click(Sender: TObject);
 Begin
 // Verificar el código pasado
  If IsValidEAN (Edit1.Text) = True then
     ShowMessage ('Código correcto')
  Else
     ShowMessage ('Código incorrecto');

 End;




Enviado por: José Antonio García Navarro (enetesystems@wanadoo.es)
Habiendo estado probando el algoritmo de la validación de los códigos EAN, he encontrado que no hay que preguntar si es mayor que 0, sino si es mayor o igual que 10.
A continuación mando el código corregido.


 function EsEan(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ígito de control leido en un principio
     DigitoOrig := Copy(CodigoEan, Longitud, 1);

     // Quitar el dígito de control que se ha obtenido en la lectura para procesar
     // el có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ígito de control original con el obtenido y devolver un resultado.
     Result := (Digito = StrToInt(DigitoOrig));
   end
   else
     Result := False;
 end;




Actualizado el 19/04/2001 (Correcion 0-10)