Hola amigos,
驴Alguien tiene una funci贸n para validar c贸digos de barra EAN13, calculando el d铆gito de control?.
Aqu铆 est谩 en C, pero no se como hacerlo en Harbour.
http://latecladeescape.com/t/Validar+c%C3%B3digos+EAN
Muchas gracias!!.
Hola amigos,
驴Alguien tiene una funci贸n para validar c贸digos de barra EAN13, calculando el d铆gito de control?.
Aqu铆 est谩 en C, pero no se como hacerlo en Harbour.
http://latecladeescape.com/t/Validar+c%C3%B3digos+EAN
Muchas gracias!!.
function main()
聽 聽 ? ComprobarEAN("12345678")
聽 聽 ? ComprobarEAN("12345671")
聽 聽 ? ComprobarEAN("12345670")
return nil
#pragma BEGINDUMP
#include <hbapi.h>
HB_BOOL EsSoloNumeros( const char * s)
{
聽 聽HB_BOOL resultado = HB_TRUE;
聽 聽int contador=0;
聽 聽while (resultado && contador < (int) strlen(s) )
聽 聽{
聽 聽 聽 resultado=resultado && (s[contador]>='0' && 聽s[contador] <= '9');
聽 聽 聽 contador++;
聽 聽}
聽 聽return resultado;
}
//devuelve HB_TRUE si el c贸digo es correcto
//HB_FALSE en caso contrario
HB_BOOL ComprobarEAN( const char * ean, int iLen)
{
聽 聽//empezamos suponiendo que el codigo no
聽 聽//es correcto
聽 聽HB_BOOL resultado = HB_FALSE;
聽 聽//S贸lo comprobabos si la cadena est谩 formada por
聽 聽//d铆gitos y su longitud es 8 o 13
聽 聽if (EsSoloNumeros(ean) && (iLen == 8 || iLen==13))
聽 聽{
聽 聽 聽 //Sumaremos los lugares pares por un lado y los
聽 聽 聽 //impares por otro
聽 聽 聽 int pares = 0;
聽 聽 聽 int impares = 0;
聽 聽 聽 int checksum;
聽 聽 聽 int digitoControl;
聽 聽 聽 char n[2];
聽 聽 聽 int numero;
聽 聽 聽 //Recorrer toda la cadena excluyendo el 煤ltimo lugar
聽 聽 聽 for (int i = 0; i <= (iLen-2); i++)
聽 聽 聽 {
聽 聽 聽 聽 聽sprintf( n, "%c", ean[i]);
聽 聽 聽 聽 聽numero = atoi(n);
聽 聽 聽 聽 聽if (i % 2 == 0) //Si lugar impar (empezamos por 0)
聽 聽 聽 聽 聽 聽 impares += numero;
聽 聽 聽 聽 聽else
聽 聽 聽 聽 聽 聽 pares += numero;
聽 聽 聽 }
聽 聽 聽 //En EAN13, los pares se multiplican por 3
聽 聽 聽 //En EAN8, son los impares
聽 聽 聽 if (iLen == 13)
聽 聽 聽 聽 聽pares *= 3;
聽 聽 聽 else
聽 聽 聽 聽 聽impares *= 3;
聽 聽 聽 checksum = pares + impares;
聽 聽 聽 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.
聽 聽 聽 sprintf( n, "%c", ean[iLen-1]);
聽 聽 聽 resultado = (digitoControl == atoi(n));
聽 聽} //fin if
聽 聽return resultado;
}
HB_FUNC( COMPROBAREAN )
{
聽 聽 const char * s = hb_parc(1);
聽 聽 hb_retl( ComprobarEAN(s, hb_parclen(1) ) );
}
#pragma ENDDUMPFUNCTION ComprobarEAN(cCode)
local s1,s2,l,Control,n
s1:=0 // suma de impares
s2:=0 // suma de pares
for n=1 to 6
s1:=s1+val(substr(cCode,(n*2)-1,1))
s2:=s2+val(substr(cCode,(n*2),1))
next
control:=(s2*3)+s1
l:=10
do while control>l
l:=l+10
end
control:=l-control
RETURN sTr(control,1,0)Hola
que error te da...
yo lo compile usando la herramienta hbmk2 de harbour y funciona bien
por lo que veo la funcion que muestras solo calcula los ean de 13 digitos y no los de 8 (verifica eso)
聽 聽 聽 //Recorrer toda la cadena excluyendo el 煤ltimo lugar
聽 聽 聽 for (int i = 0; i <= (iLen-2); i++)
聽 聽 聽 {
聽 聽 聽 聽 聽sprintf( n, "%c", ean[i]);
聽 聽 聽 聽 聽numero = atoi(n);
聽 聽 聽 聽 聽if (i % 2 == 0) //Si lugar impar (empezamos por 0)
聽 聽 聽 聽 聽 聽 impares += numero;
聽 聽 聽 聽 聽else
聽 聽 聽 聽 聽 聽 pares += numero;
聽 聽 聽 }