Validar CIF / NIF / NIE

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Avatar de Usuario
ainurzzz
Mensajes: 27
Registrado: 09 Sep 2007, 15:04

Validar CIF / NIF / NIE

Mensaje por ainurzzz »

Buenas tardes,

la verdad es que hace tiempo que no entro por aquí y quería aportar algo. Por necesidad he tenido que hacer unas funciones para validar CIF /NIF y NIE. Las dejo y espero que os sirvan. LA del CIF es una calcamonía traducida a Autoit de la que hay en Wikipedia para VBA. La del NIF / NIE pues es mía conforme a las reglas de validación. Las funciones son:

Func EsValidoCIF ($identificador)
Func EsValidoNIFNIE ($identificador)

Y devuelven un boleano TRUE si el CIF-NIF-NIE (A80466006) es correcto.

Espero que a alguien le sirvan y las usen..... :smt023


Código: Seleccionar todo

Func EsValidoCIF($identificador)
	
	Dim $A 
    Dim $B
    Dim $C
    Dim $CIF
    Dim $CIFDIGITO
    Dim $i
	Dim $Valido
	Dim $Digito
	Dim $letras
	
    $A = 0
    $B = 0
 
    $Valido = False
	if 	StringLen($identificador) <> 9 then return $valido
	if not StringIsAlNum($identificador) then return $valido
		
	$CIF = StringMid($identificador, 2, 7) ;se obtienen los dígitos centrales
    $CIFDIGITO = StringRight($identificador, 1) ;dígito de control
	
	For $i = 1 To 6 Step 2
        $A = $A + StringMid($CIF, $i + 1, 1)   ;Suma de posiciones pares
        $C = 2 * StringMid ($CIF, $i, 1)       ;Doble de posiciones impares
        $B = $B + Mod($C ,10) + Int($C / 10)   ;Suma de digitos de doble de pares
    Next
	
	;para obtener el cálculo de la cifra de la séptima posición que no se trata
    ;en el bucle
    $B = $B + (mod((2 * StringMid($CIF, 7, 1)),10) + Int((2 * stringMid($CIF, 7, 1)) / 10))
 
    ;se obtiene la unidad de la cifra total
    $C = Mod((10 - mod(($A + $B) ,10)) , 10)
	
	$aletras = ("J|A|B|C|D|E|F|G|H|I")
	$letras = StringSplit("J|A|B|C|D|E|F|G|H|I","|",2)
	
	$AA = StringLeft($identificador, 1)
	
	Select
	Case $AA = "K" or $AA = "P" or $AA = "R" or $AA = "Q" or $AA = "S" or $AA = "W"
		$Digito = $letras[$C]
	Case $AA = "A" or $AA = "B" or $AA = "E" or $AA = "H" or $AA = "J" or $AA = "U" or $AA = "V"	
		$Digito = $C
	Case Else
			
		If IsNumber($CIFDIGITO) Then
             $Digito = $C
         Else
             $Digito = $letras[$C]
		EndIf

		
	EndSelect
	
	if $CIFDIGITO = $Digito then $Valido = True
		
	
	return $Valido
	
	
EndFunc




















Func EsValidoNIFNIE($identificador)
	
	$valido = True
	$ultimoDigito = stringmid($identificador,StringLen($identificador),1)
	
	
	If Not StringIsAlNum($identificador) Then
		$valido = False	
		ConsoleWrite("1")
	Elseif StringLen($identificador)<> 9 then 
		$valido = False
		ConsoleWrite("2")
	ElseIF ObtieneLetraNIFNIE($identificador) <> $ultimoDigito then
		$valido = False
		ConsoleWrite(ObtieneLetraNIFNIE($identificador))
	EndIf
	
	
	Return $valido
	
EndFunc

Func ObtieneLetraNIFNIE($identificador)
	; Tipo 11111111H
	
	Dim $Letra
	
	; Identificamos si es NIF o NIE
	$primerDigito = StringUpper(StringMid($identificador,1,1))
	$Letras = "T|R|W|A|G|M|Y|F|P|D|X|B|N|J|Z|S|Q|V|H|L|C|K|E"
	$aLetras = StringSplit($Letras,"|",2)
	
	
	if IsNumber($primerDigito) then 
	
		; realmente no hacemos nada  :-Ping
		; lo dejo me gusta verlo así.

		
	ElseIf $primerDigito = "X" then 
		
		$identificador = StringReplace($identificador,"X","")
		
	ElseIf $primerDigito = "Y" then 
		$identificador = StringReplace($identificador,"Y","1")
		
	ElseIf $primerDigito = "Z"  then
		$identificador = StringReplace($identificador,"Z","2")
				
	EndIf
		
	$pos = Mod($identificador,23)
	$Letra = $aLetras[$pos]
	
	
	
	Return $Letra
	
EndFunc
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Validar CIF / NIF / NIE

Mensaje por Ximorro »

El cálculo de la letra de NIF en una línea (comprobaciones de formato aparte):

Código: Seleccionar todo

Func _LetraNIF($num)
	Return StringMid("TRWAGMYFPDXBNJZSQVHLCKE", Mod($num, 23)+1, 1)
EndFunc
:smt002

El CIF es más complicado, claro.
Si te interesa profundizar en este tema aquí tienes un programa que hice hace un tiempo para esto del CIF/NIF/NIE, algo más completo, con GUI, contemplando los NIF especiales (letras K, L y M) y con la codificación de tipos de CIF y provincias de expedición. También hice una pequeña ayuda explicando el tema:
http://www.emesn.com/autoitforum/viewto ... f=5&t=1844
Con la traducción del VBA ya habrás aprendido AutoIt, estudiando otro código AutoIt aún aprenderás más.
Mi programa aún se puede ampliar más, por ejemplo decodificando país para las entidades no residentes (letra N).

Por cierto, los CIF de letra T no tienen código de control, así que no hay que calcularlo (probablemente te daría que es incorrecto). Esos hay que validarlos siempre.

Una cosa, te recomiendo que no uses DIM para declarar variables, está obsoleto y se mantiene por razones de compatibilidad, es mejor usar Global o Local (en tu caso Local pues son variables de funciones). Ah, y puedes poner varias variables en una línea, eso ya es cosa de gustos, lo digo por si no lo sabías:
Local $A, $B, $C, $CIF, $CIFDIGITO, $i, $Valido, $Digito, $letras
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
EuroHack
Mensajes: 13
Registrado: 30 Dic 2011, 17:09

Re: Validar CIF / NIF / NIE

Mensaje por EuroHack »

Silo haces funcionar pon de fondo un DNI para hacerlo mas chulo.
Responder