Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Limpiar caracteres y dar formato a un IBAN (https://www.clubdelphi.com/foros/showthread.php?t=87228)

Delphitest 02-12-2014 08:21:09

Limpiar caracteres y dar formato a un IBAN
 
Buenos días,

quiero aprovechar los datos que tengo en una tabla que contiene números de cuentas bancarias.

A la hora de meter esos datos se ha hecho sin prestar demasiada atención al formato y me encuentro con mucha variedad de datos.

Por ejemplo hay cuentas que contienen espacios entre los números, otras con "/" y otras con "-"

Me gustaría hacer una función o procedimiento a modo de filtro que sea capaz de "sanear" ese dato.

Es decir que se encargue de recorrer el contenido, quitar los caracteres "/" o "-" y que devuelva un formato estándar del tipo:

XX99 9999 9999 9999 9999 9999

¿Alguien puede echarme una mano?

Muchas Gracias

newtron 02-12-2014 09:33:01

Hola.

Lo que puedes hacer es usar la instrucción StringReplace para eliminar de la cadena los caracteres extraños que pueda haber, p.e.:

Código Delphi [-]
Cuenta:=StringReplace(Cuenta, '/', '', [rfReplaceAll]);
Cuenta:=StringReplace(Cuenta, '-', '', [rfReplaceAll]);

... y así por cada uno de los caracteres raros que creas que puede haber.

Esto al final tiene que darte una cadena de 24 caracteres, si no es así tendrás que revisarla manualmente.

Saludos

engranaje 02-12-2014 13:48:20

Mi propuesta es tratar la cadena ignorando todos los caracteres que no sean números devolviendo un mensaje de error si no hay 20 números exactos (longitud de una cuenta bancaria española válida) y devolviendo la cadena con 20 números en caso contrario.

Código Delphi [-]
Function cadenaACuentaEsp20digitos(candidata:string):string;
var
 i:integer;
begin
  for i := 0 to length(candidata) do
  begin
    if candidata[i] in ['1','2','3','4','5','6','7','8','9','0']  then
      result := result + candidata[i];
  end;

  if length(result) <> 20 then
    result:='No es una cuenta bancaria española válida'

end;

Una vez tienes la cadena de 20 números que entendemos que es un número de cuenta válido (se puede comprobar el dígito de control para asegurarnos). Si lo quieres pasara a un iban español Válido toca añadilre ESXX donde xx son los dígitos de control resultantes de aplicar el algoritmo correspondiente a los 20 digitos de la cuenta mas el código del pais (ES en el caso de españa).
Entiendo que el algoritmo para el cálculo de los dígitos de control ya lo tienes y que el problema se te planteaba solo a la hora de obtener un número de cuenta válido a partir de tus datos bancarios actuales.

newtron 02-12-2014 14:08:53

Esa sería mejor opción pero siempre y cuando se tenga como premisa de que todas las cuentas corrientes son españolas y tratando entonces solamente el antiguo código de cuenta de 20 dígitos pero claro, no sabemos cómo están los datos, si con el IBAN incluido o no.

Saludos

engranaje 02-12-2014 14:35:25

Totalmente de acuerdo. Me he "columpiado" dando por hecho, sin que en la pregunta lo ponga, que se trata de recorrer una tabla con números de cuenta españoles antiguos (los de 20 caracteres) que no están formateados. Para obtener el IBAN. Pero efectivamente si en el campo puede tener un numero de cuent antiguo o un IBAN de cualquier pais ya nos podemos ir a 34 caracteres pudiendo ser los 2 primeros letras que identifiquen al pais y dependiendo el número de caracteres restantes del pais que se trate. O sea que en ese caso mi propuesta no sirve.

duilioisola 02-12-2014 16:42:23

Código Delphi [-]
function Modulo97(s: string): integer;
var
  v, l : integer;
  alpha : string;
  number : longint;
begin
  v := 1;
  l := 9;
  Result := 0;
  alpha := '';

  while (v <= Length(s)) do
  begin
     if (l > Length(s)) then
        l := Length(s);
     alpha := alpha + Copy(s, v, l);
     number := StrToInt(alpha);
     Result := number mod 97;
     v := v + l;
     alpha := IntToStr(Result);
     l := 9 - Length(alpha);
  end;
end;

function ChangeAlpha(input: string): string;
var
  a : char;
begin
  /// A -> 10, B -> 11, C -> 12 ...
  Result := input;
  for a := 'A' to 'Z' do
  begin
     Result := StringReplace(Result, a, IntToStr(Ord(a) - 55), [rfReplaceAll]);
  end;
end;

function IBANValido(IBAN: string): boolean;
var
  l : integer;
begin
  Result := True;

  IBAN := UpperCase(IBAN);

  // Compruebo que sean caracteres válidos
  for l := 1 to Length(IBAN) do
     if (not (IBAN[l] in ['A'..'Z', '0'..'9'])) then
        Result := False;

  if (Result) then
  begin
     // Paso los primeros 4 digitos al final (Pais + Control)
     IBAN := IBAN + Copy(IBAN, 1, 4);
     Delete(IBAN, 1, 4);

     // Convierto letras a digitos
     iban := ChangeAlpha(IBAN);

     // Si el resto de modulo 97 es 1 es una cuenta válida
     Result := (Modulo97(IBAN) = 1);
  end;
end;

procedure Limpia_IBAN;
var
  l : integer;
  TmpIBAN : string;
begin
  while ??? do
  begin
     // Cargo variable con la IBAN que estoy recorriendo
     IBAN := ???;

     // Tomo solo los caracteres validos
     IBAN := UpperCase(IBAN);
     for l := 1 to Length(IBAN) do
        if ((IBAN[l] in ['A'..'Z', '0'..'9'])) then
           TmpIBAN := TmpIBAN + IBAN[i];
     
     if IBANValido(TmpIBAN) then
     begin
        // IBAN correcto y limpio. Actualizo el dato en la base de datos
        ???
     end
     else
     begin
        // Algo no está bien con el IBAN. Mensaje, Log, ...
        ShowMessage('Revisar: ' + IBAN);
     end;
  end;
end;

Delphitest 02-12-2014 19:35:54

Muchas gracias a todos,

esto último suena bien pero mis conocimientos no dan para tanto... ;)

Me quedo con la opción sencilla de de newtron

Código Delphi [-]
Cuenta:=StringReplace(Cuenta, '/', '', [rfReplaceAll]);

Con esto saneo todas las cuentas y me quedo con los 24 caracteres que necesito.

Quiero dar un paso más si es posible.

El resultado es por ejemplo. ES9999999999999999999999

¿Como podría hacer para hacer grupos de 4 caracteres separados por un espacio en blanco?

Sería para obtener ES99 9999 9999 9999 9999 9999

ElKurgan 02-12-2014 20:20:36

Código Delphi [-]
function FormatearCuenta(const s: string): string;
begin
  // Espero siempre 24 dígitos
  If length(s) <> 24 then
    Result := ''
  else
    Result := 
      Copy(s, 1, 4) + ' ' + 
      Copy(s, 5, 4) + ' ' 
      Copy(s, 9, 4) + ' ' 
      Copy(s, 13, 4) + ' ' 
      Copy(s, 17, 4) + ' ' 
      Copy(s, 21, 4) ; 
end;

Por supuesto, hay formas más eficientes de hacerlo, pero como idea vale

Saludos

Delphitest 02-12-2014 20:28:19

Muchas gracias, así da gusto ;)

He añadido los + que faltan porque me daba error pero una vez puestos todo OK

Ahora que ya tengo el formato deseado quiero rizar el rizo, jejejej

Abro otro hilo para no mezclar preguntas diferentes.

Gracias de nuevo a todos por vuestra ayuda.


La franja horaria es GMT +2. Ahora son las 07:31:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi