PDA

Ver la Versión Completa : Calcular la letra del NIF (España)


Neftali [Germán.Estévez]
20-06-2006, 13:25:29
Es simple, calcula la letra del NIF (España).


function NIF(DNI: String): Char;
const
STR_CHARS = 'TRWAGMYFPDXBNJZSQVHLCKET';
begin
Result := Copy(STR_CHARS, (StrToInt(DNI) mod 23) + 1, 1)[1];
end;


Gracias a Seoane se añade una funcion para validar el NIF, le pasamos como parametro el documento entero incluido letras y nos devuelve TRUE si es correcto.


function EsNIFCorrecto(NIF: String): Boolean;
var
Numero: Integer;
begin
Result:= FALSE;
if Length(NIF) = 9 then
begin
// Normal
if TryStrToInt(Copy(NIF,1,Length(NIF)-1),Numero) then
Result:= Uppercase(Copy(NIF,Length(NIF),1)) = LetraNIF(Numero);
// Extranjero
if Uppercase(Copy(NIF,1,1)) = 'X' then
if TryStrToInt(Copy(NIF,2,Length(NIF)-2),Numero) then
Result:= Uppercase(Copy(NIF,Length(NIF),1)) = LetraNIF(Numero);
end;
end;


Ejemplo de uso:


if EsNIFCorrecto('12345678Z') then
ShowMessage('Correcto')
else
ShowMessage('Incorrecto');

seoane
20-06-2006, 13:25:30
Con permiso de German voy a añadir una funcion para validar el NIF, le pasamos como parametro el documento entero incluido letras y nos devuelve TRUE si es correcto.


function LetraNIF(Numero: Integer): string;
begin
Result:= copy('TRWAGMYFPDXBNJZSQVHLCKET',1 + numero mod 23,1);
end;

function EsNIFCorrecto(NIF: String): Boolean;
var
Numero: Integer;
begin
Result:= FALSE;
if Length(NIF) = 9 then
begin
// Normal
if TryStrToInt(Copy(NIF,1,Length(NIF)-1),Numero) then
Result:= Uppercase(Copy(NIF,Length(NIF),1)) = LetraNIF(Numero);
// Extranjero
if Uppercase(Copy(NIF,1,1)) = 'X' then
if TryStrToInt(Copy(NIF,2,Length(NIF)-1),Numero) then
Result:= Uppercase(Copy(NIF,Length(NIF),1)) = LetraNIF(Numero);
end;
end;


Ejemplo de uso:

if EsNIFCorrecto('12345678Z') then
ShowMessage('Correcto')
else
ShowMessage('Incorrecto');

seoane
20-06-2006, 13:28:04
Como editar no funciona tengo que corregir asi:


function EsNIFCorrecto(NIF: String): Boolean;
var
Numero: Integer;
begin
Result:= FALSE;
if Length(NIF) = 9 then
begin
// Normal
if TryStrToInt(Copy(NIF,1,Length(NIF)-1),Numero) then
Result:= Uppercase(Copy(NIF,Length(NIF),1)) = LetraNIF(Numero);
// Extranjero
if Uppercase(Copy(NIF,1,1)) = 'X' then
if TryStrToInt(Copy(NIF,2,Length(NIF)-2),Numero) then
Result:= Uppercase(Copy(NIF,Length(NIF),1)) = LetraNIF(Numero);
end;
end;

Neftali [Germán.Estévez]
20-06-2006, 14:38:26
Añadidos los comentarios de Seoane al original.

Casimiro Notevi
20-06-2006, 15:01:11
Yo lo tengo un poco más simplificado:


function LetraNIF( NIF:integer): Char;
const S = 'TRWAGMYFPDXBNJZSQVHLCKET';
begin
result := S[(NIF mod 23)+1];
end;


y la llamada habitual:

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage( LetraNIF(12345678) );
end;

Mick
20-06-2006, 15:51:13
Puestos a simplificar ni funcion ni nada, usar direcatmente
esta linea ;)

PChar('TRWAGMYFPDXBNJZSQVHLCKET')[NIF mod 23]