martes 24 de noviembre de 2009

Formateo y Validación de RUN(Java Script)


Bueno, hoy mostraré un par de funciones bastante utilizadas y que la mayoría de los que programan habitualmente mas de alguna ver las deben haber usado, así es que acepto mejoras al código que pondré a continuación.

Para los que no lo sepan, el RUN(Rol Único Nacional), es el número que identifica a cada uno de los ciudadanos en chile, en españa creo que hay algo parecido llamado DNI, de manera que ya sabemos de que hablamos ahora vamos con los ejemplos.

Formateando el RUN

Bueno la idea es la siguiente tener un campo de texto <input> que cuando pierda el foco (método onblur de javascript) pase de un número del tipo 111111111 a lo mismo pero formateado como RUN o sea 11.111.111-1.

Esto lo hacemos recorriendo el string ingresado hacia atrás y luego del último caracter ponemos el "-" luego vamos contando de a 3 los caracteres y tras ello ponemos el ".".

Finalmente luego de este recorrido a la inversa, volvemos a recorrer el string a la inversa guardandolo en una nueva variable que será el RUN formateado en el sentido correcto.

Se que esto suena a Chino pero el el código es el siguiente.




function formato_rut(rut)
{
var sRut1 = rut.value;
//contador de para saber cuando insertar el . o la -
var nPos = 0;

//Guarda el rut invertido con los puntos y el guión agregado
var sInvertido = "";

//Guarda el resultado final del rut como debe ser
var sRut = "";

for(var i = sRut1.length - 1; i >= 0; i-- )
{

sInvertido += sRut1.charAt(i);
if (i == sRut1.length - 1 )
sInvertido += "-";
else if (nPos == 3)
{
sInvertido += ".";
nPos = 0;
}
nPos++;
}

for(var j = sInvertido.length - 1; j >= 0; j-- )
{
if (sInvertido.charAt(sInvertido.length - 1) != ".")
sRut += sInvertido.charAt(j);
else if (j != sInvertido.length - 1 )
sRut += sInvertido.charAt(j);

}
//Pasamos al campo el valor formateado
rut.value = sRut.toUpperCase();
}


Validación del RUN



Bueno la validación no es mas que comprobar e acuedo a una formula matemática que el RUN corresponda como se hace esto, no lo mostraré aca pero aquí queda muy claro la idea que hay detras del algoritmo, per vamos al código.


function valida_rut(rut)
{
//Valor acumulado para el calculo de la formula
var nAcumula = 0;
//Factor por el cual se debe multiplicar el valor de la posicion
var nFactor = 2;
//Dígito verificador
var nDv = 0;

//extraemos el ultimo numero o letra que corresponde al verificador
//La K corresponde a 10
if (rut.charAt(rut.length - 1).toUpperCase() == 'K' )
nDvReal = 10;
//el 0 corresponde a 11
else if (rut.charAt(rut.length - 1)== 0 )
nDvReal = 11;
else
nDvReal = rut.charAt(rut.length - 1);

for (nPos = rut.length -2; nPos >=0; nPos--)
{
nAcumula += rut.charAt(nPos).valueOf() * nFactor;
nFactor++;

if (nFactor > 7) nFactor = 2;
}

nDv = 11-(nAcumula % 11)

if (nDv == nDvReal)
return true;

return false;
}

Con esto ya tenemos las dos funciones y una combinación de las 2 nos permite ingresar siempre datos de forma correcta y con el formato adecuado antes de proceder a envíar estos datos al servidor.


Una posible mejora es hacer una llamada ajax para ver si el dato ya se encuentra en la base de datos pero eso es otro cuento.

1 comentarios:

Cristian Ortiz M. dijo...

Gracias, me sirvió bastante, sumado a que gane mucho tiempo al evitarme desarrollar un código propio.

Ademas te felicito porque el código prácticamente no necesita cambios.

saludos.