Diferencia entre revisiones de «Algoritmia/Algoritmo para obtener la letra del NIF»

Contenido eliminado Contenido añadido
He mejorado el programa de cobol
 
(No se muestran 41 ediciones intermedias de 27 usuarios)
Línea 19:
La I y la O se descartan para evitar confusiones con otros caracteres, como 1, l o 0.
 
Se usan [[23|veintitrés]] letras por ser esteéste un [[número primo]].
 
== Ejemplos ==
Línea 27:
=== [[Programación en Ada|Ada]] ===
 
EsteÉste es el código fuente en [[Programación en Ada|Ada]] para calcular la letra del NIF.
 
<sourcesyntaxhighlight lang=ada>
function Letra_Nif (Dni : Positive) return Character is
Letras : constant String := "TRWAGMYFPDXBNJZSQVHLCKE";
Línea 35:
return Letras ((Dni mod Letras'Length) + 1);
end Letra_Nif;
</syntaxhighlight>
</source>
 
=== [[Programación en Matlab|Matlab]] ===
 
Éste es el código fuente en [[Programación en Matlab|Matlab]] para calcular la letra del NIF.
 
<syntaxhighlight lang=matlab>
dni=12345678
res=dni-floor(dni/23)*23;
A=['T','R','W','A','G','M','Y','F','P','D','X','B','N','J','Z','S','Q','V','H','L','C','K','E'];
letra=A(res+1)
</syntaxhighlight>
 
 
=== [[AppleScript]] ===
Código fuente del cálculo de la Letra del NIF en [[AppleScript]]
<sourcesyntaxhighlight lang=applescript>
on LetraDNI(dni)
return character (1 + (dni as integer) mod 23) of "TRWAGMYFPDXBNJZSQVHLCKE"
end LetraDNI
</syntaxhighlight>
</source>
 
=== [[Manual de ASP/ASP & VBScript|ASP 3.0 VBScript]] ===
<sourcesyntaxhighlight lang=asp>
Function sacaLetra(ByVal dni)
Dim tabla,pos
Línea 53 ⟶ 65:
sacaLetra = tabla(pos)
End Function
</syntaxhighlight>
</source>
Y para Validar el NIF:
<sourcesyntaxhighlight lang=asp>
Function validaNIF(ByVal nif)
Dim dni
Línea 65 ⟶ 77:
End If
End Function
</syntaxhighlight>
</source>
 
=== [[Bash|Bourne shell script]] ===
<sourcesyntaxhighlight lang=bash>
echo TRWAGMYFPDXBNJZSQVHLCKE | cut -c $(( $(( $1 % 23 )) + 1 ))
</syntaxhighlight>
</source>
otra forma sin utilizar las órdenes externas (echo y cut)
<sourcesyntaxhighlight lang=bash>
LETRANIF="TRWAGMYFPDXBNJZSQVHLCKE"
DNI=12345678
echo ${LETRANIF:$DNI % 23:1}
</syntaxhighlight>
</source>
 
=== [[Programación en C|C]] ===
<sourcesyntaxhighlight lang="c">
#include <stdlib.h>
#include <string.h>
Línea 106 ⟶ 118:
return 0;
}
</syntaxhighlight>
</source>
 
=== [[Programación en C++|C++]] ===
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
using namespace std;
 
char letraDNI(unsigned int dni);
 
char letraDNI(unsigned int dni)
{
return "TRWAGMYFPDXBNJZSQVHLCKE"[dni % 23];
}
 
int main()
{
int dni;
cout << "Introduce el DNI: ";
cin >> dni;
char letra = letraDNI(dni);
 
return 0;
cout << "TRWAGMYFPDXBNJZSQVHLCKE"[dni % 23] << endl;
fflush(stdin);
printf("j");
getchar();
}
 
</syntaxhighlight>
</source>
 
=== [[Programación en C++ Builder|C++ Builder]] ===
<sourcesyntaxhighlight lang="cpp">
AnsiString Letra(AnsiString Nif)
{
Línea 173 ⟶ 187:
}
}
</syntaxhighlight>
</source>
 
=== [[Visual C++|VC++ 2008]] ===
<sourcesyntaxhighlight lang="c">
/// <summary> Genera la letra correspondiente a un DNI. </summary>
public: System::String^ LetraNIF(System::String^ dni)
Línea 183 ⟶ 197:
return Correspondencia[ Convert::ToInt32(dni) % 23 ].ToString() ;
}
</syntaxhighlight>
</source>
 
=== [[C sharp NET|C#]] ===
Línea 190 ⟶ 204:
* El NIE esta compuesto de 9 caracteres Letra+7digitos+Letra, debe tenerse esto encuenta al realizar las validaciones de tamaño.
En las comparaciones longitud y conversión a entero, debe poner (nie.Length != 9) y (!int.TryParse(nie.Substring(1,7), out n) o jamas aceptara un NIE real como valido.
<sourcesyntaxhighlight lang="csharp">
/// <summary> Tabla de asignación. </summary>
public const string CORRESPONDENCIA = "TRWAGMYFPDXBNJZSQVHLCKE";
Línea 235 ⟶ 249:
}
}
</syntaxhighlight>
</source>
 
=== [[C sharp NET|C#]] (versión mejorada con expresiones regulares) ===
Versión mejorada que usa [https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular expresiones regulares] para comprobar que el DNI está compuesto por 8 dígitos y que el nie está compuesto por el caracter 'X', 'Y' o 'Z' (independientemente de que sea en mayúsculas o minúsculas) seguido de 7 dígitos.
 
<sourcesyntaxhighlight lang="csharp">
/// <summary> Tabla de asignación. </summary>
public const string CORRESPONDENCIA = "TRWAGMYFPDXBNJZSQVHLCKE";
Línea 255 ⟶ 269:
throw new ArgumentException("El DNI debe contener 8 dígitos.");
}
 
NOTA: Si la expresión anterior no cuenta bien la cantidad de dígitos probar con:
Match match = new Regex(@"\d{8}").Match(dni);
 
/// <summary> Genera la letra correspondiente a un NIE. </summary>
Línea 280 ⟶ 297:
throw new ArgumentException("El NIE debe comenzar con la letra X, Y o Z seguida de 7 dígitos.");
}
</syntaxhighlight>
</source>
 
=== [[Programación en Cobol|Cobol]] ===
 
<syntaxhighlight lang=cobol>
*****************************************************
* devuelve la letra correspondiente a un número DNI *
*****************************************************
WORKING-STORAGE SECTION.
01 WS-WORK-AREA.
05 COM-AREA.
10 COM-DNI PIC 9(8).
10 COM-LETRA PIC X.
10 COM-OK PIC XX.
05 AUX-COCIENTE PIC 9(9) VALUE ZEROS.
05 AUX-RESTO PIC 99 VALUE ZEROS.
05 CTE-23 PIC 99 VALUE 23.
05 LETRAS PIC X(23) VALUE 'TRWAGMYFPDXBNJZSQVHLCKE'.
05 TBL-LETRA REDEFINES LETRAS
OCCURS 23 TIMES
PIC X.
LINKAGE SECTION.
01 LS-DATOS PIC X(11).
PROCEDURE DIVISION USING LS-DATOS.
1000-PRINCIPAL.
PERFORM 2000-INICIO
THRU 2000-INICIO-EXIT.
PERFORM 3000-PROCESO
THRU 3000-PROCESO-EXIT.
PERFORM 8000-FIN
THRU 8000-FIN-EXIT.
GOBACK.
2000-INICIO.
DISPLAY 'COMIENZA EL PROGRAMA LETRADNI'.
MOVE LS-DATOS TO COM-AREA.
2000-INICIO-EXIT.
EXIT.
3000-PROCESO.
COMPUTE AUX-RESTO = FUNCTION MOD (COM-DNI, CTE-23) + 1.
MOVE TBL-LETRA(AUX-I) TO COM-LETRA.
3000-PROCESO-EXIT.
EXIT.
8000-FIN.
MOVE COM-AREA TO LS-DATOS.
DISPLAY 'FIN DEL PROGRAMA LETRADNI'.
8000-FIN-EXIT.
</syntaxhighlight>
 
=== [[Fortran]] ===
<sourcesyntaxhighlight lang="fortran">
program TREVISONE
implicit none
Línea 299 ⟶ 374:
end program TREVISONE
</syntaxhighlight>
</source>
 
=== [[Java (Sun)|Java]] ===
 
<sourcesyntaxhighlight lang="java">
 
public static final String NIF_STRING_ASOCIATION = "TRWAGMYFPDXBNJZSQVHLCKE";
Línea 316 ⟶ 391:
}
 
</syntaxhighlight>
</source>
 
=== [[Programación en JavaScript|JavaScript]] ===
 
<sourcesyntaxhighlight lang=javascript>
// devuelve la letra correspondiente a un número DNI
function letraDni(dni) {
return "TRWAGMYFPDXBNJZSQVHLCKE".charAt(dni % 23);
}
</syntaxhighlight>
</source>
 
Ejecutable en navegador:
 
<sourcesyntaxhighlight lang=javascript>
Javascript:letraDni(numeroDni);
</syntaxhighlight>
</source>
 
=== [[lenguaje de programación Pascal|Pascal]]/[[Programación en Delphi|Delphi]] ===
 
<sourcesyntaxhighlight lang="Delphi">
Function IsValidNIF(ANIF: String): Boolean;
Var
Línea 355 ⟶ 430:
End;
end;
</syntaxhighlight>
</source>
 
=== [[Programación en Perl|Perl]] ===
 
<sourcesyntaxhighlight lang="perl">
sub LetraDNI {
my $dni = shift;
return substr( 'TRWAGMYFPDXBNJZSQVHLCKE', $dni % 23, 1);
}
</syntaxhighlight>
</source>
 
=== [[Programación en PHP|PHP]] ===
 
<sourcesyntaxhighlight lang="php">
function letra_nif($dni) {
Línea 376 ⟶ 451:
$numero = "12345678";
echo 'El NIF del DNI "'.$numero.'" es "'.$numero.letra_nif($numero).'"';
</syntaxhighlight>
</source>
 
=== [[Usuario:Pilonieta/Python|Python]] ===
 
<sourcesyntaxhighlight lang="python">
def letra_nif(numeros):
DNI=12345678
NIF=' return "TRWAGMYFPDXBNJZSQVHLCKE'"[numeros%23]
</syntaxhighlight>
print "El NIF del DNI es", NIF[DNI%23]
</source>
 
=== [[Programación en Ruby|Ruby]] ===
 
<sourcesyntaxhighlight lang=ruby>
puts "TRWAGMYFPDXBNJZSQVHLCKE"[gets.to_i % 23].chr
</syntaxhighlight>
</source>
 
=== [[Visual Basic]] ===
 
<sourcesyntaxhighlight lang=vb>
Private Function NIF(DNI As Long)
NIF = DNI & "-" & Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (DNI Mod 23) + 1, 1)
End Function
</syntaxhighlight>
</source>
 
=== [[Excel]] ===
<sourcesyntaxhighlight lang=vb>
=CONCATENAR(A1;MED("TRWAGMYFPDXBNJZSQVHLCKE";RESTO(A1;23)+1;1))
=CONCATENAR(A1;EXTRAE("TRWAGMYFPDXBNJZSQVHLCKE";RESIDUO(A1;23)+1;1))
Línea 407 ⟶ 481:
En calc (OpenOffice)
=CONCATENAR(A1,MID("TRWAGMYFPDXBNJZSQVHLCKE",RESIDUO(A1,23)+1,1))
</syntaxhighlight>
</source>
 
Siendo A1 la celda de origen del DNI sin letra.
Línea 413 ⟶ 487:
=== [[PL-SQL]] ===
 
<sourcesyntaxhighlight lang=plsql>
 
declare @nif varchar(9)
declare @dni int
Línea 420 ⟶ 495:
set @nif = CONVERT(varchar(8),@dni) + SUBSTRING('TRWAGMYFPDXBNJZSQVHLCKE', @dni % 23 + 1, 1)
 
print @nif
</syntaxhighlight>
</source>
 
en sentencias SELECT:
 
<sourcesyntaxhighlight lang=plsql>
SELECT CONVERT(varchar(8),tablaPersonas.dni) + SUBSTRING('TRWAGMYFPDXBNJZSQVHLCKE', tablaPersonas.dni % 23 + 1, 1)
FROM tablaPersonas
</syntaxhighlight>
</source>
 
o más simple para ORACLE:
 
<sourcesyntaxhighlight lang=plsql>
SELECT dni||SUBSTR('TRWAGMYFPDXBNJZSQVHLCKETTRWAGMYFPDXBNJZSQVHLCKE',MOD(dni,23)+1,1)
FROM tablaPersonas
</syntaxhighlight>
</source>
 
siendo tablaPersonas la tabla con el dato de usuario y el campo dni el origen del DNI y en formato entero (int).
 
=== [[SAP]] ===
<sourcesyntaxhighlight lang=abap>
FORM resultado USING VALUE(GV_NUMBER)
DATA GV_result(9) TYPE c.
Línea 451 ⟶ 527:
CONCATENATE lv_number gv_character INTO gv_result.
ENDFORM. " resultado
</syntaxhighlight>
</source>
 
Siendo gv_result el nº de nif con la letra.
 
=== [[PL/1]] ===
<sourcesyntaxhighlight lang=text>
CALCULAR_LETRA: PROC(DNI) RETURNS(CHAR);
DCL DNI PIC '99999999';
Línea 467 ⟶ 543:
RETURN(LETRA);
END CALCULAR_LETRA;
</syntaxhighlight>
</source>
 
Previamente hay que declarar en el programa que se importa la función del sistema para hallar restos:
<sourcesyntaxhighlight lang=text>
DCL (MOD) BUILTIN;
</syntaxhighlight>
</source>
 
== Enlaces externos ==
* [httphttps://www.calculadnigeneradatos.com/ CalculaDNI.com - CalculaObtén la letra del NIF a partirde delun DNI]
* [httphttps://www.letranif.com/ Calcula la Letra del DNI o NIF]
* [httphttps://www.andy21.com/glosario/dnie.html Página 'DNIe' de Glosario de Tecnología].
* [http://dnivalidator.sourceforge.net/ Herramienta desarrollada en C que genera DNIs, valida NIFs, verifica DNIs, etc].
* [http://www.webviva.com/biblioteca/modules.php?name=Downloads&d_op=viewdownload&cid=24 Programas] en [[Javascript]] para calcular la letra del [[NIF]].
* [http://www.necesitomas.com/index.php?q=node/51 Letra del NIF en Excel]
* [http://labs.viricmind.org/2011/07/30/validacion-de-nifs-nies-dnis-y-cifs-en-php/ Código de validación de NIFs, NIEs, DNIs y CIFs en PHP]
 
[[Categoría:AlgoritmosAlgoritmia|Algoritmo para obtener la letra del nif]]
[[Categoría:España]]