Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/04/2009, 16:47
Avatar de yeudiel
yeudiel
 
Fecha de Ingreso: abril-2008
Ubicación: Ciudad de México
Mensajes: 78
Antigüedad: 16 años
Puntos: 1
Limpiar php para obtener digito verificador, codigo de barras EAN

Pues eso que dice el titulo, quiero limpiar una pequeñisima aplicacion, ya que no me gusta como esta y no se me ocurre como, esta trabaja 100% pero quisiera limpiarla explico en que consiste.

La aplicacion se encarga de calcular el digito de verificacion de los codigo de barras EAN (12 digitos mas el digito verificador) y para ello se tienen que hacer las siguientes operaciones.

Tomamos por ejemplo el codigo de mi chocolate para beber favorito 750105922532-9 <- el 9 es el numero que se debe obtener.

1.- Paso tomamos la cadena 750105922532 y la invertimos (235229501057).
2.- Sumo los numeros en los lugares impares de la cadena 2+5+2+5+1+5=20 y el resultado lo multiplico por 3, 20 *3 = 60.
3.- Sumo los numeros en los lugares PARES de la cadena 3+2+9+0+0+7=21.
4.- Sumo el resultado del paso 2 y el paso 3 y me da 81, ahora calculo la decena inmediata superior, en este caso es 90 y a esto le resto 81, 90-81=9;

Y asi obtengo el digito verificador 9. Un poco liado pero segun se ese es el protocolo, xd.

Ahora el codigo php que use

Código PHP:
$codigo="750105922532";//codigo de mi pocholate jeje
$codigo2=strrev($codigo);//invierto el codigo
$numero1=substr($codigo2,0,1);//obtengo el primer digito
$numero2=substr($codigo2,1,1);//obtengo el segundo digito
$numero3=substr($codigo2,2,1);//shalala shalala...
$numero4=substr($codigo2,3,1);
$numero5=substr($codigo2,4,1);
$numero6=substr($codigo2,5,1);
$numero7=substr($codigo2,6,1);
$numero8=substr($codigo2,7,1);
$numero9=substr($codigo2,8,1);
$numero10=substr($codigo2,9,1);
$numero11=substr($codigo2,10,1);
$numero12=substr($codigo2,11,1);
//sumo los numeros en lugares impares y los multiplico por 3
$sub1=($numero1+$numero3+$numero5+$numero7+$numero9+$numero11)*3;
//sumo los numeros en lugares pares
$sub2=$numero2+$numero4+$numero6+$numero8+$numero10+$numero12;

$total=$sub1+$sub2;//sumo los resultados de los numeros pares e impares
$sep2=substr($total,1,1);//obtengo el segundo digito del total
if(!$sep3=substr($total,2,1)){//si el numero es de 2 cifras hace lo de abajo
if($sep2<=4){//si el numero es menor a 5 lo convierto en 6 para poder redondear hacia arriba
$sep2=6;
}
}else{
if(
$sep3<=4){//si el numero es de 3 cifras y es menor de 5 lo convierto en 6 para redondear hacia arriba
$sep3=6;
}
}
$total_tmp=$sep.$sep2.$sep3;//obtengo un total temporal esto lo hago porque
//siempre se debe redondear a la decena superior aunque el numero sea 3 se
//debe redondear a 10
$total2=round($total_tmp, -1);//redondeo el total temporal a la decena superior
$gran_total=$total2-$total;//resto el total de la decena superior que es $total2
echo " el digito verificador de $codigo es $gran_total"
Si se les ocurre como limpiarlo no duden en responder, tambien considerenlo un aporte para los codigos de barras EAN, jeje. Saludos y gracias de antemano.