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

Versión 1
estrellaestrellaestrellaestrellaestrella(13)

Publicado el 21 de Octubre del 2010gráfica de visualizaciones de la versión: Versión 1
77.283 visualizaciones desde el 21 de Octubre del 2010
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 (13)

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
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:

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

Debería ser:

1
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
Conchi
9 de Noviembre del 2017
estrellaestrellaestrellaestrellaestrella
Exacto.
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.
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

1
2
3
4
5
6
7
8
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:

1
2
3
4
5
6
7
8
9
10
11
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
Albert
13 de Junio del 2017
estrellaestrellaestrellaestrellaestrella
Os dejo una web que funciona a la perfección tanto para generar NIF, NIE y CIF válidos como para calcular y validar las cifras de control

htttp://www.generadordni.es
Responder
Carlos
24 de Julio del 2017
estrellaestrellaestrellaestrellaestrella
Hola,

habría que cambiar otra cosa en la linea 101:
1
var unidad=String(suma).substr(1,1);
cambiar por:
1
2
3
4
5
6
var unidad = "";
if(suma > 9){
    unidad=String(suma).substr(1,1);
}else{
    unidad=String(suma);
}

Un saludo,
Responder
Teo
18 de Julio del 2019
estrellaestrellaestrellaestrellaestrella
Muchas gracias, me fue de mucha ayuda!!
Responder
Sergio
3 de Septiembre del 2019
estrellaestrellaestrellaestrellaestrella
Intento hacer que funcione en la validación de un formulario PDF con adobe y no hay manera, al menos la parte del CIF que es la mas importante. Lo he adaptado todo como he podido. ¿Alguna idea? Gracias.
Responder
Luis Rojas
8 de Mayo del 2020
estrellaestrellaestrellaestrellaestrella
Hola ,
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):

1
2
3
// Sumamos las dos sumas que hemos realizado
suma=suma+suma2;
var unidad=String(suma).substr(String(suma).length-1,1)

Con esa corrección ya me funciona bien.
Responder

Comentar la versión: Versión 1

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

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s1992