Last active
June 19, 2025 17:03
-
-
Save perezdans/0f55c9d126b038ee25b2382bb1073da1 to your computer and use it in GitHub Desktop.
Validar un Nif/CIF/NiE con javascript. Se ejecuta validateCIF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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