Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-12-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
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
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #2  
Antiguo 02-12-2014
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.475
Poder: 21
newtron Va camino a la fama
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
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 02-12-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 14
engranaje Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 02-12-2014
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.475
Poder: 21
newtron Va camino a la fama
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
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 02-12-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 14
engranaje Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 02-12-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.738
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;
Responder Con Cita
  #7  
Antiguo 02-12-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
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
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #8  
Antiguo 02-12-2014
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
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
Responder Con Cita
  #9  
Antiguo 02-12-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
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.
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cálculo de los dígitos IBAN Troffed Trucos 9 26-07-2020 18:08:27
Cálculo / Validación del IBAN Angel.Matilla C++ Builder 17 05-02-2014 13:12:29
Dar formato a una cadena con vocales tildadas y otros caracteres noob Varios 8 25-02-2009 17:15:09
Como leer un Email en formato HTLM y que se muestren las imagenes y todo su formato jesus02018 Internet 0 28-12-2008 11:22:10
Como calcular codigo IBAN cinecito Varios 2 11-05-2004 18:49:44


La franja horaria es GMT +2. Ahora son las 14:38:27.


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