Publicado por: 15

Con esta clase javascript, la validación de nif y/o cif y/o tarjetas de residencia será pan comido.

Controla el formato del valor que queramos mediante expresiones regulares, y comprueba que la letra se corresponda con el número introducido.

Aquí tenéis el fichero para descargar: nif_cif_validator

Y aquí os dejamos el código completo:

(perdonad que no lo tabulemos)


function NIF_CIFValidator() { this.NIF_Letters = "TRWAGMYFPDXBNJZSQVHLCKET"; this.NIF_regExp = "^\\d{8}[a-zA-Z]{1}$"; this.CIF_regExp = "^[a-zA-Z]{1}\\d{7}[a-jA-J0-9]{1}$"; this.checkAll = function (value) { if (this.checkCIF(value)) { // Comprueba el CIF return true; } else if (this.checkTR(value)) { // Comprueba tarjeta de residencia return true; }else if (this.checkNIF(value)) { // Comprueba el NIF return true; } else { // Si no pasa por ninguno es false. return false; } } // VALIDA EL NIF this.checkNIF = function (nif) { // Comprueba la longitud. Los DNI antiguos tienen 7 digitos. if ((nif.length != 8 ) && (nif.length != 9)) return false; if (nif.length == 8 ) nif = '0' + nif; // Ponemos un 0 a la izquierda y solucionado // Comprueba el formato var regExp=new RegExp(this.NIF_regExp); if (!nif.match(regExp)) return false; var let = nif.charAt(nif.length-1); var dni = nif.substring(0,nif.length-1) var letra = this.NIF_Letters.charAt(dni % 23); return (letra==let.toUpperCase()); } // VALIDA TARJETA DE RESIDENCIA this.checkTR = function (tr) { if ((tr.length!=10) && (tr.length!=9)) return false; if ((tr.charAt(0).toUpperCase() != "X") && (tr.charAt(0).toUpperCase() != "Y") && (tr.charAt(0).toUpperCase() != "Z")) return false; var leftNum = '0'; if (tr.charAt(0).toUpperCase() == "Y") leftNum = '1'; if (tr.length==9) { return this.checkNIF(leftNum + tr.substring(1,tr.length)); } else { return this.checkNIF(tr.substring(1,tr.length)); } } // VALIDA TARJETA DE RESIDENCIA this.checkCIF = function (cif) { var v1 = new Array(0,2,4,6,8,1,3,5,7,9); var tempStr = cif.toUpperCase(); // pasar a mayúsculas var temp = 0; var temp1; var dc; // Comprueba el formato var regExp=new RegExp(this.CIF_regExp); if (!tempStr.match(regExp)) return false; // Valida el formato? if (!/^[ABCDEFGHIJKLMNPQS]/.test(tempStr)) return false; // Es una letra de las admitidas ? for( i = 2; i <= 6; i += 2 ) { temp = temp + v1[ parseInt(cif.substr(i-1,1)) ]; temp = temp + parseInt(cif.substr(i,1)); }; temp = temp + v1[ parseInt(cif.substr(7,1)) ]; temp = (10 - ( temp % 10)); if (temp==10) temp=0; dc = cif.toUpperCase().charAt(8); return (dc==temp) || (temp==1 && dc=='A') || (temp==2 && dc=='B') || (temp==3 && dc=='C') || (temp==4 && dc=='D') || (temp==5 && dc=='E') || (temp==6 && dc=='F') || (temp==7 && dc=='G') || (temp==8 && dc=='H') || (temp==9 && dc=='I') || (temp==0 && dc=='J'); } }
function NIF_CIFValidator() {

 this.NIF_Letters = "TRWAGMYFPDXBNJZSQVHLCKET";
 this.NIF_regExp = "^\\d{8}[a-zA-Z]{1}$";
 this.CIF_regExp = "^[a-zA-Z]{1}\\d{7}[a-jA-J0-9]{1}$";

 this.checkAll = function (value) {
 if (this.checkCIF(value)) { // Comprueba el CIF
 return true;
 } else if (this.checkTR(value)) { // Comprueba tarjeta de residencia
 return true;
 }else if (this.checkNIF(value)) { // Comprueba el NIF
 return true;
 } else { // Si no pasa por ninguno es false.
 return false;
 }
 }

 // VALIDA EL NIF
 this.checkNIF = function (nif) {
 // Comprueba la longitud. Los DNI antiguos tienen 7 digitos.
 if ((nif.length != 8 ) && (nif.length != 9)) return false;
 if (nif.length == 8 ) nif = '0' + nif; // Ponemos un 0 a la izquierda y solucionado
 
 // Comprueba el formato
 var regExp=new RegExp(this.NIF_regExp);
 if (!nif.match(regExp)) return false;

 var let = nif.charAt(nif.length-1);
 var dni = nif.substring(0,nif.length-1)
 var letra = this.NIF_Letters.charAt(dni % 23);
 return (letra==let.toUpperCase());
 }

 // VALIDA TARJETA DE RESIDENCIA
 this.checkTR = function (tr) {
 if ((tr.length!=10) && (tr.length!=9)) return false;
 if ((tr.charAt(0).toUpperCase() != "X") && (tr.charAt(0).toUpperCase() != "Y") && (tr.charAt(0).toUpperCase() != "Z")) return false;
 
 var leftNum = '0';
 if (tr.charAt(0).toUpperCase() == "Y") leftNum = '1';
 
 if (tr.length==9) {
 return this.checkNIF(leftNum + tr.substring(1,tr.length));
 } else {
 return this.checkNIF(tr.substring(1,tr.length));
 }
 }

 // VALIDA TARJETA DE RESIDENCIA
 this.checkCIF = function (cif) {
 var v1 = new Array(0,2,4,6,8,1,3,5,7,9);
 var tempStr = cif.toUpperCase(); // pasar a mayúsculas
 var temp = 0;
 var temp1;
 var dc;

 // Comprueba el formato
 var regExp=new RegExp(this.CIF_regExp);
 if (!tempStr.match(regExp)) return false; // Valida el formato?
 if (!/^[ABCDEFGHIJKLMNPQS]/.test(tempStr)) return false; // Es una letra de las admitidas ?

 for( i = 2; i <= 6; i += 2 ) {
 temp = temp + v1[ parseInt(cif.substr(i-1,1)) ];
 temp = temp + parseInt(cif.substr(i,1));
 };
 temp = temp + v1[ parseInt(cif.substr(7,1)) ];
 temp = (10 - ( temp % 10));
 if (temp==10) temp=0;
 dc = cif.toUpperCase().charAt(8);
 return (dc==temp) || (temp==1 && dc=='A') || (temp==2 && dc=='B') || (temp==3 && dc=='C') || (temp==4 && dc=='D') || (temp==5 && dc=='E') || (temp==6 && dc=='F') || (temp==7 && dc=='G') || (temp==8 && dc=='H') || (temp==9 && dc=='I') || (temp==0 && dc=='J');
 }
}

15 Comentarios

    1. Administrador Microteching Autor del artículo

      Creo que debería ser algo así (aunque no lo he probado):
      var oIdValidator = new NIF_CIFValidator();
      if (oIdValidator.checkAll(document.getElementById(‘YOUR_INPUT_ID’).value)) {
      alert(‘ok’);
      } else {
      alert(‘identificación erronea’);
      }

    1. Administrador Microteching Autor del artículo

      En realidad primero tienes que instanciar el objeto y luego usar el método que quieras.
      En algúna parte del load de la página tendría que haber algo como:
      var idValidator = new NIF_CIFValidator();

      Y entonces en el onchange ya podrías poner algo así como:
      onchange=”return idValidator.checkAll(this.value);”

      De todas formas, deberías añadir algo para la presentación, es decir, desde poner un alert, a ir poniendo los inputs en verde o en rojo según son correctos o incorrectos.
      Espero que te ayude,
      Saludos.

  1. Morgan

    Para probar he hecho una página sencilla y he seguido sus instrucciones y no funciona.

    DNI

    var dni = new NIF_CIFValidator();

    1. Morgan

      Hola, parece que lo escribí mal antes, pero sigue sin funcionar, espero que me puedas ayudar, gracias.

      DNI

      var dni = new NIF_CIFValidator();
      dni.checkAll();
      alert(dni.NIF_Letters);

      1. Morgan

        Muchas gracias, funciona perfectamente. Realicé un curso y solo explicaron java y c. Y en las prácticas me veo con javascript y php. Un saludo.

  2. Manuel Prieto

    Hola este CIF no funciona el validador:

    J99488769

    Creo que es por la linea de las letras admitidas del CIF:

    if (!/^[ABCDEFGHIJKLMNPQS]/.test(tempStr)) return false; // Es una letra de las admitidas ?

    No has añadido la “IJ”

    Con eso funciona perfecto. Si no es eso, por favor corrigeme 🙂

    Un saludo!

    1. Administrador Microteching Autor del artículo

      Pues entiendo que debe ser eso.
      Estas dos letras se nos pasaron en su día.
      Gracias por el apunte!
      Actualizo el post.
      Saludos!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.