Validar códigos EAN
Detalles- Detalles
- Categoría: Programación
- Publicado el Domingo, 07 Enero 2007 05:27
El codigo EAN (European Article Number) es un sistema de código de barras para asignar un número único a cada producto. Los códigos más comunes tienen 8 o 13 dígitos, especialmente 13 (sistemas conocidos como EAN8 y EAN13). En ellos van codificados el pais de origen del producto, la empresa y el propio producto. El último de los dígitos es un dígito de control para evitar errores de transcripción.
El algoritmo para comprobar que un código EAN8 o EAN13 ha sido transcrito correctamente es extremadamente sencillo.
Podemos describirlo algoritmicamente de esta manera:
- Comprobar que el código tiene 8 o 13 dígitos. De no ser así, no es correcto.
- Sumar los dígitos de lugares pares por un lado y los de los impares por otro, pero sin incuir el último dígito.
- Si el código es EAN13, multiplicar la suma de los pares por 3.
- Si el código es EAN8, es la suma de los impares la que se multiplica por 3.
- Sumar el resultado de los pares y el de los impares y hallar el resto de la división por 10.
- Realizar la operación 10 menos ese resto y ese es el dígito de control.
- Si como resultado sale 10, entenderemos que el dígito de control es 0.
- Comprobar que el dígito de control que hemos calculado y el último dígito del código EAN coinciden
Por ejemplo, para validar el código EAN8 "12345678" (Obviamente es inventado)

- Separar el dígito de control. Nos quedamos con "1234567" y "8"
- Sumar pares: sumapares=2+4+6=12
- Sumar impares: sumaimpares=1+3+5+7=16
- Como es EAN8, multiplicamos los impares por 3.
- sumaimpares=16*3=48
- Sumar el resultado de pares e impares: 12+48=60
- Hallar el resto de la division por 10: 60 mod 10 = 0
- Hacer 10-resto: 10-0=10
- Como nos ha salido 10, el dígito de control es 0.
- Comparar el dígito de control que hemos calculado con el que tenía el código: Nos sale 0 y el código tenía un 8. Es incorrecto.
Este método en C# realiza la validación de un código EAN8 o EAN13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | //IMPORTANTE: Se supone que el parámetro de entrada //"ean" está formado sólo por dígitos y son exactamente 8 o 13 //Método auxiliar para comprobar que una //cadena está formada sólo por dígitos bool EsSoloNumeros(String s) { bool resultado = true; int contador=0; while (resultado && contador<s.length) { resultado=resultado && (s[contador]>='0' && s[contador] <= '9'; contador++; } return resultado; } //devuelve TRUE si el código es correcto //FALSE en caso contrario bool ComprobarEAN(String ean) { //empezamos suponiendo que el codigo no //es correcto bool resultado = false; //Sólo comprobabos si la cadena está formada por //dígitos y su longitud es 8 o 13 if (EsSoloNumeros(ean) && (ean.Length == 8 || ean.Length==13)) { //Sumaremos los lugares pares por un lado y los //impares por otro int pares = 0; int impares = 0; //Recorrer toda la cadena excluyendo el último lugar for (int i = 0; i <= (ean.Length-2); i++) { if (i % 2 == 0) //Si lugar impar (empezamos por 0) impares += int.Parse(ean.Substring(i, 1)); else pares += int.Parse(ean.Substring(i, 1)); } //En EAN13, los pares se multiplican por 3 //En EAN8, son los impares if (ean.Length == 13) pares *= 3; else impares *= 3; int checksum = pares + impares; int digitoControl = 10 - (checksum % 10); //Si el digito de control es 10, entendemos 0 if (digitoControl == 10) digitoControl = 0; //Comprobar que el digito de control obtenido y el //de la cadena ean sean el mismo. resultado = (digitoControl == int.Parse(ean.Substring(ean.Length-1, 1))); } //fin if return resultado; } |
Para saber más acerca de EAN:
-En El rinconcito de Delphi hay un excelente tutorial acerca de los códigos EAN y su impresión como código de barras.

