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
function cc_CalcDV_Ean(Ean: String): Integer; overload; { Calcula y devuelve el dígito verificador de una cadena de código EAN13 o EAN8 Devuelve -1 en caso de ser incorrecto. } var SP, SI, I, L:Integer; Impar: Boolean; begin L:= Length(Ean); if (L=8) or (L=13) then begin SI:= 0; SP:= 0; I:= L-1; Impar:= True; repeat // Bucle para sumar los valores discriminando posiciones pares e impares if Impar then SI:= SI + StrToInt(Ean[I]) else SP:= SP + StrToInt(Ean[I]); Impar:= not Impar; I:= I - 1; until I =0; if Impar then SI:= SI*3 else SP:= SP*3; // Multiplica por tres según la longitud del código Result:= 10-(SI+SP) mod 10; // Calcula el dígito de verificación end else Result:= -1; 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.
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.










