Ir al contenido


Foto

Como calcular el CURP (México), RNC (Rep. Dom.), DNI y NIF (España)


  • Por favor identifícate para responder
23 respuestas en este tema

#21 edyaca

edyaca

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 18 noviembre 2013 - 07:23

:smiley:  muchas gracias
  • 0

#22 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 19 noviembre 2013 - 04:56

Me sumo a los algoritmos de validacion de codigos con este que valida un número de cuenta de banco español.

Son siempre de 20 digitos, 4+4+2+10 = banco+sucursal+digitos de control+numero de cuenta, y los digitos de control se permite dejarlos a ** si no se conocen.



delphi
  1. procedure cccValidaEspana(pCta: String);
  2. var
  3.   banco, control, cuenta: String;
  4.   i: integer;
  5.   cero: boolean;
  6. begin
  7.   // Para evitar errores al insertar registros
  8.   if pCta<>'' then begin
  9.     if length(pCta)<>20 then
  10.       raise Exception.Create('El texto a validar como numero de cuenta no tiene 20 caracteres');
  11.     cero:= true;
  12.     for i:= 1 to 8 do
  13.       cero:= cero and (pCta[i]='0');
  14.     if cero then
  15.       raise EHCException.Create('No se admiten cuenta bancarias con el codigo de banco y/o sucursal a cero, si no conoce la cuenta dejelo en blanco.');
  16.  
  17.     Banco:=  copy(pCta, 1, 8);
  18.     Control:= copy(pCta, 9, 2);
  19.     Cuenta:=  copy(pCta,11,10);
  20.  
  21.     try
  22.       StrToFloat(Banco+Cuenta)
  23.     except
  24.       raise Exception.Create('Cuenta bancaria erronea'+#10+
  25.               'Solo debe contener numeros ó asteriscos en los digitos de control');
  26.     end;
  27.     if (Control[1] in ['0'..'9']) and (Control[2] in ['0'..'9']) then begin
  28.       if Control <> cccSuma(Banco)+cccSuma(Cuenta) then
  29.         raise Exception.Create('Cuenta bancaria erronea'+#10+
  30.               'Los digitos de control no se corresponden con la cuenta');
  31.     end else if Control <> '**' then
  32.       raise Exception.Create('Los digitos de control deben ser solo digitos ó asteriscos')
  33.   end;
  34. end;
  35.  
  36. function  cccSuma( Str: String ): String;
  37. var i, lon, n: integer;
  38.     Pesos: array [0..9] of integer;
  39. begin
  40.   Pesos[0]:= 6; Pesos[1]:= 3; Pesos[2]:= 7; Pesos[3]:= 9; Pesos[4]:=10;
  41.   Pesos[5]:= 5; Pesos[6]:= 8; Pesos[7]:= 4; Pesos[8]:= 2; Pesos[9]:= 1;
  42.   lon:= length(Str);
  43.   n:= 0;
  44.   for i:= 1 to lon do
  45.     n:= n+ StrToInt(copy(Str,lon-i+1,1)) * Pesos[i-1];
  46.   n:= 11 - ( n mod 11 );
  47.   if n=10 then n:=1;
  48.   if n=11 then n:=0;
  49.   Result:= IntToStr(n);
  50. end;


  • 0

#23 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 19 noviembre 2013 - 05:49

Y un pseudo-codigo para cálcular el código IBAN de una cuenta de banco cualquiera:



delphi
  1. 1) Tomas el numero de cuenta sin espacios ni guiones ni nada (ejemplo aleman, sin digitos de control) :
  2.   370400440532013000
  3. 2) Añades al final el pais y digitos de control vacios 00 ('ES00' ó 'DE00' en el ejemplo):
  4.   370400440532013000DE00
  5. 3) Cambias las letras que queden a numeros segun esta tabla:
  6.   A=10, B=11, C=12, D=13, E=14, F=15, G=16, H=17, I=18, J=19, K=20, L=21, M=22,
  7.   N=23, O=24, P=25, Q=26, R=27, S=28, T=29, U=30, V=31, W=32, X=33, Y=34, Z=35
  8.   370400440532013000DE00 se convierte en 370400440532013000131400
  9. 4) 370400440532013000131400 mod 97 = 9
  10. 5) 98 - 9 = 89
  11.   Al final quedaria asi: DE89 37040044 0532013000



Fuente: http://www.europeban...de.htm#5<br />

Calculadora (para cuentas en España en principio): http://www.bankia.es...des/codigo-iban

Ejemplos de cuentas bancarias con su IBAN añadido y otros detalles de todos los paises europeos: http://www.ecbs.org/iban.htm

La lista más completa que he encontrado de paises con sus formatos de cuenta: http://en.wikipedia....dating_the_IBAN

Nota: Aunque el algorítmo para calcular estos 2 dígitos es siempre el mismo, hay "detalles" importantes que saber según el país: En algunos paises se usa unos dígitos de control fijos para todas las cuentas (porque su código de cuenta ya incluye estos mismos códigos de control, con lo que "repetir" el algorítmo te dá siempre un 1) y, también, es necesario conocer el largo total de la cuenta con su IBAN para poder comprobarlo antes de nada, y esta longitud depende del país.

Sería interesante que si alguien tiene el código IBAN de un par de cuentas, pase el algoritmo y así podríamos saber en qué paises se usa y en cuales no, si es que existe alguno que no lo sé a ciencia cierta.
  • 0

#24 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 19 noviembre 2013 - 10:53

Ampliando lo comentado por Sergio, dejo algo de código:


delphi
  1. unit IBAN;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils;
  7.  
  8. function CalcularIBANEsp(Entidad, Oficina, DC, Cuenta: String): String; overload;
  9. function CalcularIBANEsp(CCC: String): String; overload;
  10. function ComprobarIBAN(Str: String): Boolean;
  11.  
  12. implementation
  13.  
  14. function EsNumero(Str: String): Boolean;
  15. var
  16.   i: Integer;
  17. begin
  18.   Result:= TRUE;
  19.   for i:= 1 to Length(Str) do
  20.     if not (Str[i] in ['0'..'9']) then
  21.     begin
  22.       Result:= FALSE;
  23.       break;
  24.     end;
  25. end;
  26.  
  27. function mod97(Str: String): Integer;
  28. begin
  29.   Result:= 0;
  30.   while Length(Str) > 0 do
  31.   begin
  32.     Result:= StrToInt(IntToStr(Result) + Copy(Str,1,6)) mod 97;
  33.     Delete(Str,1,6);
  34.   end;
  35. end;
  36.  
  37. function lPad(Str: String; n: Integer): String;
  38. begin
  39.   while Length(Str) < n do
  40.     Str:= '0' + Str;
  41.   Result:= Str;
  42. end;
  43.  
  44. // Calcula el IBAN para una cuenta española
  45. function CalcularIBANEsp(Entidad, Oficina, DC, Cuenta: String): String; overload;
  46. begin
  47.   if EsNumero(Entidad + Oficina + DC + Cuenta) then
  48.   begin
  49.     Entidad:= lPad(Entidad,4);
  50.     Oficina:= lPad(Oficina,4);
  51.     DC:=      lPad(Dc,2);
  52.     Cuenta:=  lPad(Cuenta,10);
  53.     Result:= Format('IBAN ES%2.2d %s %s %s%s %s %s', [
  54.       98 - mod97(Entidad + Oficina + DC + Cuenta + '142800'),
  55.       Entidad,Oficina,DC,Copy(Cuenta,1,2),Copy(Cuenta,3,4), Copy(Cuenta,7,4)]);
  56.   end else
  57.     Result:= EmptyStr;
  58. end;
  59.  
  60. // Calcula el IBAN para una cuenta española
  61. function CalcularIBANEsp(CCC: String): String; overload;
  62. begin
  63.   Result:= EmptyStr;
  64.   if (Length(CCC)=20) and EsNumero(CCC)  then
  65.     Result:= CalcularIBANEsp(Copy(CCC,1,4),Copy(CCC,5,4),Copy(CCC,9,2),
  66.       Copy(CCC,11,10));
  67. end;
  68.  
  69. // Comprueba cualquier IBAN
  70. function ComprobarIBAN(Str: String): Boolean;
  71. var
  72.   i: Integer;
  73.   S: String;
  74. begin
  75.   Result:= FALSE;
  76.   if Uppercase(Copy(Str,1,Length('IBAN '))) = 'IBAN ' then
  77.     Str:= Copy(Str,5,MAXINT);
  78.   S:= EmptyStr;
  79.   for i:= 1 to Length(Str) do
  80.     if Str[i] in ['0'..'9'] then
  81.       S:= S + Str[i]
  82.     else if Upcase(Str[i]) in ['A'..'Z'] then
  83.       S:= S + IntToStr(Ord(Str[i])-Ord('A')+10)
  84.     else if Str[i] <> #32 then
  85.       Exit;
  86.   S:= Copy(S,7,MAXINT) + Copy(S,1,6);
  87.   Result:= mod97(S) = 1;
  88. end;
  89.  
  90. end.



Son dos funciones, una sirve para calcular el IBAN de una cuenta española y la otra para comprobar cualquier IBAN (aunque sean de otro país).

Por ejemplo:


delphi
  1.   Writeln(CalcularIBANEsp('20800708913000012345'));
  2.   Writeln(ComprobarIBAN(CalcularIBANEsp('20800708913000012345')));    // El número de cuenta del ejemplo no es de verdad !!!


  • 0




IP.Board spam blocked by CleanTalk.