Skip to content

Instantly share code, notes, and snippets.

@perezdans
Last active June 19, 2025 17:03
Show Gist options
  • Save perezdans/0f55c9d126b038ee25b2382bb1073da1 to your computer and use it in GitHub Desktop.
Save perezdans/0f55c9d126b038ee25b2382bb1073da1 to your computer and use it in GitHub Desktop.
Validar un Nif/CIF/NiE con javascript. Se ejecuta validateCIF
<script type="text/javascript">
<!--
/*
Fuente de la informacion:
http://bulma.net/impresion.phtml?nIdNoticia=2248
http://www.trucomania.org/trucomania/truco.cgi?337&esp
http://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_fiscal#C.C3.A1lculo_de_la_letra_del_NIF
A - Sociedades Anónimas
B - Sociedades de responsabilidad limitada
C - Sociedades colectivas
D - Sociedades comanditarias
E - Comunidades de bienes
F - Sociedades cooperativas
G - Asociaciones y otros tipos no definidos
H - Comunidades de propietarios
J - Sociedades civiles, con o sin personalidad jurídica
K - Españoles menores de 14 años
L - Españoles residentes en el extranjero sin DNI
M - NIF que otorga la Agencia Tributaria a extranjeros que no tienen NIE
N - Entidades extranjeras
P - Corporaciones locales
Q - Organismos autónomos
R - Congregaciones e instituciones religiosas
S - Organos de la administración
U - Uniones Temporales de Empresas
V - Otros tipos no definidos en el resto de claves
W - Establecimientos permanentes de entidades no residentes en España
X - Extranjeros identificados por la Policía con un número de identidad de extranjero, NIE, asignado hasta el 15 de julio de 2008
Y - Extranjeros identificados por la Policía con un NIE, asignado desde el 16 de julio de 2008 (Orden INT/2058/2008, BOE del 15 de julio )
Z - Letra reservada para cuando se agoten los 'Y' para Extranjeros identificados por la Policía con un NIE
La ultima cifra es el dígito de control, que puede ser o bien un número o bien
una letra, en función del tipo de sociedad.
A las categorias P (Ayuntamientos) y X (Extranjeros) les corresponde una letra
en lugar de un número.
El dígito de control se calcula con las 7 cifras restantes del CIF (quitando la
primera y la ultima), con el siguiente algoritmo:
- CIF: A58818501
- Quitamos la primera y la ultima cifra:
5881850
- Sumamos las cifras pares:
Suma = 8 + 1 + 5 = 14
- Ahora sumamos cada cifra impar multiplicada por dos, y sumamos las cifras del
resultado:
5 * 2 = 10 ==> 1 + 0 = 1
8 * 2 = 16 ==> 1 + 6 = 7
8 * 2 = 16 ==> 1 + 6 = 7
0 * 2 = 0 ==> 0
- y volvemos a sumar esos resultados a la suma anterior:
Suma=Suma+1+7+7+0;
- Al final de este proceso, tenemos que Suma=29, pues bien, nos quedamos con la
cifra de las unidades (9)
- Restamos esta cifra de las unidades de 10, dándonos un 1, que es el código de
control para todos los tipos de sociedades exceptuando la X que se verifica
como un DNI.
- Para las sociedades K, P, Q y S habria que sumar un 64 al digito de control que
hemos calculado para hallar el ASCII de la letra de control:
Chr(64+(10-(Suma mod 10)))
*/
/*
* Tiene que recibir el cif sin espacios ni guiones
*/
function validateCIF(cif) {
//Quitamos el primer caracter y el ultimo digito
var valueCif=cif.substr(1,cif.length-2);
var suma=0;
//Sumamos las cifras pares de la cadena
for(i=1;i<valueCif.length;i=i+2) {
suma=suma+parseInt(valueCif.substr(i,1));
}
var suma2=0;
//Sumamos las cifras impares de la cadena
for(i=0;i<valueCif.length;i=i+2) {
result=parseInt(valueCif.substr(i,1))*2;
if(String(result).length==1) {
// Un solo caracter
suma2=suma2+parseInt(result);
} else {
// Dos caracteres. Los sumamos...
suma2=suma2+parseInt(String(result).substr(0,1))+parseInt(String(result).substr(1,1));
}
}
// Sumamos las dos sumas que hemos realizado
suma=suma+suma2;
var unidad=String(suma).substr(1,1)
unidad=10-parseInt(unidad);
var primerCaracter=cif.substr(0,1).toUpperCase();
if(primerCaracter.match(/^[FJKNPQRSUVW]$/)) {
//Empieza por .... Comparamos la ultima letra
if(String.fromCharCode(64+unidad).toUpperCase()==cif.substr(cif.length-1,1).toUpperCase())
return true;
} else if(primerCaracter.match(/^[XYZ]$/)){
//Se valida como un dni
var newcif;
if(primerCaracter=="X")
newcif=cif.substr(1);
else if(primerCaracter=="Y")
newcif="1"+cif.substr(1);
else if(primerCaracter=="Z")
newcif="2"+cif.substr(1);
return validateDNI(newcif);
} else if(primerCaracter.match(/^[ABCDEFGHLM]$/)) {
//Se revisa que el ultimo valor coincida con el calculo
if(unidad==10)
unidad=0;
if(cif.substr(cif.length-1,1)==String(unidad))
return true;
} else {
//Se valida como un dni
return validateDNI(cif);
}
return false;
}
/*
* Tiene que recibir el dni sin espacios ni guiones
* Esta funcion es llamada
*/
function validateDNI(dni) {
var lockup = 'TRWAGMYFPDXBNJZSQVHLCKE';
var valueDni=dni.substr(0,dni.length-1);
var letra=dni.substr(dni.length-1,1).toUpperCase();
if(lockup.charAt(valueDni % 23)==letra)
return true;
return false;
}
document.write("<br>CIF: "+validateCIF("a58818501"));
document.write("<br>DNI: "+validateDNI("38119995w"));
//-->
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment