|
domingo, 07 de enero de 2007 |
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 //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" />= '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. |