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');
}
}
Que es lo que esta mal?
Gracias!
bonita función y muy útil, muchas gracias.
Gracias a ti!!
Tiene buena pinta, pero ¿puedes poner un ejemplo de uso?
Gracias!
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’);
}
no funciona, en html en el input del nif hemos puesto onchange=»return NIF_CIFValidator (this.value)»
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.
Para probar he hecho una página sencilla y he seguido sus instrucciones y no funciona.
DNI
var dni = new NIF_CIFValidator();
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);
Hola Morgan,
Te he preparado un ejemplo para que puedas ver en este link como funciona:
https://jsfiddle.net/jorsang1/o7pwpdzg/1/
Saludos!
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.
Me alegro que te haya funcionado!
Un saludo!
Llegué por casualidad por aquí, pero qué bien me ha venido. Muchas gracias.
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!
Pues entiendo que debe ser eso.
Estas dos letras se nos pasaron en su día.
Gracias por el apunte!
Actualizo el post.
Saludos!