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