Jump to content


Photo

Verificar el dígito verificador de un GTIN.


  • Please log in to reply
1 reply to this topic

#1 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 posts
  • LocationMisiones, Argentina

Posted 01 March 2014 - 01:20 PM

Hace un tiempo se me ocurrió incluir entre mis bibliotecas una que sea capaz de verificar un código EAN-13, EAN-8, UPC, etc. Inclusive ISBN, CUIT (Código Único de Identificación Tributaria, en Argentina).
Noté que la Wikipedia no tenía un algoritmo y yo me encontraba en un proceso de "algorithmic undonkeing".


Surguió esto (no basado en la Wiki) aunque ahora existe este código allí.
Aquí les dejo el caso de EAN-13 y EAN-8.

Hay que pasar en cadena de caracteres, los 13 u 8 dígitos, según el caso.



delphi
  1. function cc_CalcDV_Ean(Ean: String): Integer; overload;
  2. { Calcula y devuelve el dígito verificador de una cadena de código EAN13 o EAN8
  3.   Devuelve -1 en caso de ser incorrecto. }
  4. var
  5.   SP, SI, I, L:Integer;
  6.   Impar: Boolean;
  7. begin
  8.   L:= Length(Ean);
  9.   if (L=8) or (L=13) then
  10.     begin
  11.     SI:= 0;
  12.     SP:= 0;
  13.     I:= L-1;
  14.     Impar:= True;
  15.     repeat // Bucle para sumar los valores discriminando posiciones pares e impares
  16.       if Impar then SI:= SI + StrToInt(Ean[I]) else SP:= SP + StrToInt(Ean[I]);
  17.       Impar:= not Impar;
  18.       I:= I - 1;
  19.     until I =0;
  20.     if Impar then SI:= SI*3 else SP:= SP*3; // Multiplica por tres según la longitud del código
  21.     Result:= 10-(SI+SP) mod 10; // Calcula el dígito de verificación
  22.   end else Result:= -1;
  23. end;



La variable L puede eliminarse haciendo I:= Length(Ean) - 1, usar if (L=7) or (L=12), quitar I:= L-1 dejando el valor de I intacto.
Pero de la manera que aparece arriba es más legible. ;)

No es que me guste ponerle nombres estrambóticos a mis funciones, es que es un intento de tenerlas separadas por cabecera a aquellas que pertenecen a una misma biblioteca. (h)

8o|
En el intento de generalización y practicidad, esta función es llamada por otra que toma el dígito verificador y lo compara con el calculado y devuelve un valor verdadero en caso de ser correcto. No me pareció importante agregarla. Pero hay que tener en cuenta que en esta otra función es necesario conocer la longitud de la cadena, el dígito de verificación y pasarlos en la lista de variables (var). Aquí eliminadas.

  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 01 March 2014 - 05:10 PM

Por si a alguien le es de utilidad, en este otro post se habló de como generar códigos de barra, yo aporté un par de units que lo hacían para ciertos formatos, y el dígito de control creo que es este mismo, así teneis más versiones para utilizar!

http://www.delphiacc...48700/#msg48700
  • 0




IP.Board spam blocked by CleanTalk.