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 ENDDUMP
FUNCTION 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)
//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;
}
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: No registered users and 36 guests