Código de JavaScript - Validar un CIF, NIF y DNI

Imágen de perfil

Validar un CIF, NIF y DNIgráfica de visualizaciones


JavaScript

estrellaestrellaestrellaestrellaestrella(7)
Publicado el 21 de Octubre del 2010 por Xavi
29.698 visualizaciones desde el 21 de Octubre del 2010. Una media de 98 por semana
Código que muestra como validar un CIF, NIF y DNI, explicando como hacerlo.

Versión 1
estrellaestrellaestrellaestrellaestrella(7)

Publicado el 21 de Octubre del 2010gráfica de visualizaciones de la versión: Versión 1
29.699 visualizaciones desde el 21 de Octubre del 2010. Una media de 98 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<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 (7)

Gustavo
14 de Octubre del 2014
estrellaestrellaestrellaestrellaestrella
No funciona bien
Responder
José Ángel
17 de Diciembre del 2014
estrellaestrellaestrellaestrellaestrella
Como bien indica Gustavo, el código de validación del CIF es incorrecto.
Por ejemplo este CIF:P0200100F lo marca como incorrecto, cuando es perfectamente válido.

Saludos.
Responder
rodikito
20 de Febrero del 2015
estrellaestrellaestrellaestrellaestrella
El CIF J22382949 tampoco lo valida. Estoy encontrando especial dificultad en validar CIFs empezados por J (sociedades civiles)

saludos
Responder
Manel
24 de Febrero del 2015
estrellaestrellaestrellaestrellaestrella
Los nifs que empiezan por R no los valida bien.
Responder
Manel
24 de Febrero del 2015
estrellaestrellaestrellaestrellaestrella
Creo que he encontrado el problema:

La linea:

var unidad=String(suma).substr(1,1)

Debería ser:

var unidad = String(suma).substr(String(suma).length - 1, 1);

Yo lo he modificado así y ahora los que empiezan por "FJKNPQRSUVW" o "ABCDEFGHLM" los valida bien.
Responder
Jose Luis
28 de Abril del 2015
estrellaestrellaestrellaestrellaestrella
La validación de algunos tipos no es correcta según https://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_fiscal

Para los que empiezan por "ABCDEFGHJLMUV" hay que validar el número.
Responder
Jordi Garcia Duran
12 de Febrero del 2016
estrellaestrellaestrellaestrellaestrella
He detectado y corregido el error para los CIF que no terminan con letra que daban error como por ejemplo: F08216863

Hay que cambiar en las líneas 104-110

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;
}


Por esto:

var lastchar=cif.substr(cif.length-1,1);
var lastcharchar=lastchar;
if(isInteger(lastchar)) {
lastcharchar=String.fromCharCode(64+parseInt(lastchar));
}
if(primerCaracter.match(/^[FJKNPQRSUVW]$/)) {
//Empieza por .... Comparamos la ultima letra
if(String.fromCharCode(64+unidad).toUpperCase()==lastcharchar) {
return true;
}
}


( sólo hay que convertir el último dígito en letra para validar, si es un número entero)
Responder

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios

http://lwp-l.com/s1992