viernes, 24 de julio de 2009

Validador de Rut en Spry (corregido)


En un post anterior publiqué un validador de Rut para el framework javascript Spry. Dicho validador tenía un problema con Internet Explorer 7 (no me pregunten por IE6 porque no me interesa desarrollar para esa versión), el cual fue descubierto por Lester. El problema estaba en que IE no permite manipular strings de la misma forma como lo hace Gecko. En el código publicado, tenía un ciclo de esta forma:
for(i=(elRut.length-1); i>=0; i--){
factor = factor > 7 ? 2 : factor;
suma += parseInt(elRut.[i])*parseInt(factor++);
}

La forma de acceder a cada elemento del primer string del rut era por medio de string[i] pero a IE no le gusta eso, así es que lo cambié por la función charAt() que permite acceder a X parte de un string indicado por la posición del caracter.

El ciclo quedó así:
for(i=(elRut.length-1); i>=0; i--){
factor = factor > 7 ? 2 : factor;
suma += parseInt(elRut.charAt(i))*parseInt(factor++);
}

Adicionalmente cambié el manejo de expresiones regulares al canón de Spry. En resumen el validador quedó así:

'rut':{
 regExpFilter: /^([0-9])+\-([kK0-9])+$/,
 validation: function(value){
 if(value == ''){
  return false;
 }
 var regExp = /^([0-9])+\-([kK0-9])+$/;
 if (!regExp.test(value)) {
  return false;
 }
 var RUT  = value.split("-");
 var elRut = RUT[0]
 var factor = 2;
 var suma = 0;
 var dv;
 for(i=(elRut.length-1); i>=0; i--){
  factor = factor > 7 ? 2 : factor;
  suma += parseInt(elRut.charAt(i))*parseInt(factor++);
 }
 var ret = value.toString();
 dv = 11 -(suma % 11);         
 if(dv == 11){
  dv = 0;
 }else if (dv == 10){
  dv = "k";
 }
 if(dv != RUT[1].toLowerCase()){
  ret= false;
 }
 return ret;
 }
 }

Pueden descargar la versión corregida acá. También está corregida la demo.

¡Gracias Lester por el aviso!

4 comentarios:

  1. De nada colega :D

    Como buen criticón debo ser un buen beta tester, je je...

    Además que con todos estos links, el SEO se agradece, ja ja

    ResponderEliminar
  2. Anónimo10:06 a.m.

    Gracias. muy util

    ResponderEliminar
  3. Anónimo1:37 p.m.

    Excelente, muchas gracias!

    ResponderEliminar
  4. Disculpa, este código debiera aparecer, como rut, en el menú de opciones "Tipo" del campo de opciones de Spry ?
    Gracias.

    ResponderEliminar