Validar un CIF, NIF y DNI
JavaScript
Publicado el 21 de Octubre del 2010 por Xavi (548 códigos)
78.260 visualizaciones desde el 21 de Octubre del 2010
Código que muestra como validar un CIF, NIF y DNI, explicando como hacerlo.
<html>
<header>
<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>
</header>
<body>
</body>
</html>
Comentarios sobre la versión: Versión 1 (13)
Por ejemplo este CIF:P0200100F lo marca como incorrecto, cuando es perfectamente válido.
Saludos.
saludos
La linea:
Debería ser:
Yo lo he modificado así y ahora los que empiezan por "FJKNPQRSUVW" o "ABCDEFGHLM" los valida bien.
Ya que si suma tiene solo una posición, "String(suma),substr(1,1)" da error. Se debe controlar las posiciones de suma para que devuelva la última.
Para los que empiezan por "ABCDEFGHJLMUV" hay que validar el número.
Hay que cambiar en las líneas 104-110
{
//Empieza por .... Comparamos la ultima letra
}
Por esto:
var lastcharchar=lastchar;
}
//Empieza por .... Comparamos la ultima letra
}
}
( sólo hay que convertir el último dígito en letra para validar, si es un número entero)
htttp://www.generadordni.es
habría que cambiar otra cosa en la linea 101:
}
Un saludo,
He necesitado este algoritmo para validar NIF de sociedades. Funciona bien en el 90% de los casos,
pero no me validaba por ejemplo el NIF A00000026 , ya que le faltaba al algoritmo la pequeña corrección que adjunto (debemos sustituir la última línea que adjunto):
// Sumamos las dos sumas que hemos realizado
Con esa corrección ya me funciona bien.