sábado, 14 de noviembre de 2009

DNI, NIF, NIE

Muchas veces, a la hora de escribir un programa, hacer una web, etc, nos vemos en la necesidad de recoger información personal de un usuario, y en algunos casos, entre dicha información nos encontramos con el NIF/NIE de alguna persona.

Siempre que me he puesto a buscar por internet adelante, he encontrado montones de scripts que validan, calculan y formatean los NIFs, pero nunca he encontrado uno que me sirviera para los números de identificación de extranjeros, NIE.

¿Qué es eso del NIE? Pues muy sencillo, es un NIF para extranjeros. En un principio puede parecer una chorrada, pero no lo es en absoluto. Por ejemplo: Un inglés, llamémosle Paul Gascoigne, por ejemplo, quiere comprarse un pisito en Benidorm para pasar sus vacaciones en alguna terraza de la ciudad nadando en cerveza. Para realizar la compra necesitará un número de identificación ante hacienda (que somos todos, incuidos algunos extranjeros). Un NIF no se le puede dar, pues es sólo para personas con nacionalidad española. Por eso David, deberá obtener un NIE antes de poder adquirir su pisito-resaquero.

Básicamente un NIE es lo mismo que un NIF pero en el que se ha cambiado su primer dígito por una letra, que puede ser X, Y o Z. Por otro lado, a la hora de calcular la letra final, estas X,Y o Z se substituyen por un 0, 1 o 2 respectivamente, a partir de este momento, el cálculo es exáctamente el mismo que para el NIF.

A continuación muesto una serie de funciones javascript para validar y calcular automáticamente tanto NIF como NIE:

/*
  * Por CNG (www.trapallada.com).
  */
  function esNumerico(x)
  {
    var expresionRegularNDigitos = /^(\d*)$/;
    return x.match(expresionRegularNDigitos);
  }

  function esNifNie(x)
  {
    var expresionRegularNIE = /^[X-Z0-9]{1}[0-9]{7}$/;
    return x.match(expresionRegularNIE);
  }

  function obtenLetraNIF ( dni, destino )
  {
    dni.value = dni.value.toUpperCase();
    if ( esNifNie( dni.value ) )
    {
      var nifTmp = '';
      if ( esNumerico( dni.value ) )
      {
        nifTmp = dni.value;
      }
      else
      {
        switch( dni.value.charAt(0).toUpperCase() )
        {
          case 'X': nifTmp = dni.value.replace(/X/gi, "0");
                    break;
          case 'Y': nifTmp = dni.value.replace(/Y/gi, "1");
                    break;
          case 'Z': nifTmp = dni.value.replace(/Z/gi, "2");
                    break;
          default:  alert('NIF/NIE incorrecto');
        }
      }

        if ( nifTmp.length == 8 )
        {
          var cadena = 'TRWAGMYFPDXBNJZSQVHLCKET';
          var posicion = nifTmp % 23;
          destino.value = cadena.charAt(posicion);
        }
        else
        {
          destino.value = '';
        }
      }
      else
      {
        alert('NIF/NIE incorrecto');
      }
    }  
  }


Para probar este código deberemos incluir un inputbox html que realice las llamadas adecuadas:







CC-GNU LGPL


Este software está sujeto a la CC-GNU LGPL o superior.

No hay comentarios:

Publicar un comentario