Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Cálculo / Validación del IBAN

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Cálculo / Validación del IBAN Responder citando

Dado que a partir del 1 de febrero de 2014 se cambia el formato para efectuar pagos por vía telemática y hay que aplicar la normativa SEPA, la AEB ha publicado la nueva normativa para dichos soportes informáticos; se puede consultar el formato de los nuevos CSB19 (CSB 19.14) en Adeudos Directos SEPA en fichero electrónico – Esquema Básico.

El protocolo de validación lo encontré en Código Internacional de Cuenta Bancaria (IBAN) y me he hecho la rutina. Este es el código:
Código:
AnsiString CalIban(AnsiString Cuenta)
{
     AnsiString cAux;

     Cuenta = Cuenta + "142800";
     cAux   = FormatFloat("0", StrToInt(Cuenta.SubString(1, 9)) % 97);
     Cuenta = Cuenta.SubString(10, Cuenta.Length());
     while (!Cuenta.IsEmpty())
     {
          if (StrToInt(cAux) < 10)
          {
               cAux   = cAux + Cuenta.SubString(1, 8);
               Cuenta = Cuenta.SubString(9, Cuenta.Length());
          }
          else
          {
               cAux   = cAux + Cuenta.SubString(1, 7);
               Cuenta = Cuenta.SubString(8, Cuenta.Length());
          }
          cAux = FormatFloat("0", StrToInt(cAux) % 97);
     }
     return "ES" + FormatFloat("00", 98 - StrToInt(cAux));
}
//---------------------------------------------------------------------------

El 142800 que aparece en las primeras líneas es el resultado de aplicar la tabla de conversión a las letras ES y añadir un 00 necesario para que tenga la longitud adecuada, de acuerdo con la norma.

Devuelve las cuatro primeras posiciones del IBAN, que en el caso de España son ESxx siendo xx un número entre 1 y 98. El IBAN completo en el caso de España tiene 24 posiciones: las calculadas con esta rutina (ESxx) más las 20 del CCC, que mantiene su fórmula de cálculo (Letra DNI,Nº AÑOS, DIGITO CONTROL CUENTA , D.CONTROL EAN 13)

Si hubiera que calcular el IBAN para otros paises hay que tener en cuenta:
1. El código nacional según la norma ISO 3166-1 que podemos encontrar en ISO 3166-1 decoding table.
2. Dado que hay paises que en las cuentas bancarias admiten letras (caso de Francia) hay que usar la tabla de conversión que aparece en Código Internacional de Cuenta Bancaria (IBAN)
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)


Ultima edición por Angel el Sab 11 Ene, 2014 10:57 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Ampliando el código anterior que puse, para validar cualquier IBAN que se introduzca o calcular el correspondiente a un número de cuenta. Este es el código:
Código:
AnsiString CalIban(AnsiString Cuenta, AnsiString Pais)
{
     AnsiString cAux;

     if (Cuenta.Trim().IsEmpty() || Cuenta.Length() > 34)
          return "";

     Cuenta = UpperCase(Cuenta);
     cAux = "";
     for (int nPos = 0; nPos < Cuenta.Length(); nPos ++)
          if (isalpha(Cuenta.c_str()[nPos]) || isdigit(Cuenta.c_str()[nPos]))
               cAux = cAux + AnsiString(Cuenta.c_str()[nPos]);

     Cuenta = cAux;
     if (isalpha(Cuenta.c_str()[0]) && isalpha(Cuenta.c_str()[1]))    // Es IBAN
     {
          if (isalpha(Cuenta.c_str()[2]) || isalpha(Cuenta.c_str()[3]))
               return "";

          Cuenta = Cuenta.SubString(5, Cuenta.Length()) + Cuenta.SubString(1, 2) + "00";
          Pais   = Cuenta.SubString(1, 2);
     }
     else
     {
          if (Pais.IsEmpty())
               Pais = "ES";

          Cuenta = Cuenta + Pais + "00";
     }

     cAux = "";
     for (int nPos = 1; nPos <= Cuenta.Length(); nPos ++)
     {
          if (isalpha(Cuenta.c_str()[nPos - 1]))
               cAux = cAux + FormatFloat("00", Cuenta.c_str()[nPos - 1] - 55);
          else
               cAux = cAux + Cuenta.SubString(nPos, 1);
     }
     Cuenta = cAux;

     cAux   = FormatFloat("0", StrToInt(Cuenta.SubString(1, 9)) % 97);
     Cuenta = Cuenta.SubString(10, Cuenta.Length());
     while (!Cuenta.IsEmpty())
     {
          if (StrToInt(cAux) < 10)
          {
               cAux   = cAux + Cuenta.SubString(1, 8);
               Cuenta = Cuenta.SubString(9, Cuenta.Length());
          }
          else
          {
               cAux   = cAux + Cuenta.SubString(1, 7);
               Cuenta = Cuenta.SubString(8, Cuenta.Length());
          }
          cAux = FormatFloat("0", StrToInt(cAux) % 97);
     }
     return Pais + FormatFloat("00", 98 - StrToInt(cAux));
}

Explico lo que hago.
    1. A la función se le pasan dos parámetros: el número de cuenta y el país; este último puede estar vacío, en cuyo caso se toma por defecto España (ES), o contener el código internacional de país según la norma ISO 3166-1.
    2. Se convierte la cadena a mayúsculas y se desprecia todo lo que no sean letras o dígitos.
    3. Si la información que viene es ya un IBAN (para España sería ESXXEEEEOOOODDNNNNNNNNNN) se extrae el código de país y se monta la cadena para calcular los dígitos de control.
    4. Si no es un IBAN (las 20 posiciones de un CCC español o, por ejemplo, las 21 de Francia) se prepara la cadena con el código de país.
    5. Se convierten todas las letras a su equivalente numérico, según la tabla que podemos ver en Código Internacional de Cuenta Bancaria (IBAN): A = 10, B = 11, etc.
    6. Calculamos los dígitos de control de acuerdo con el módulo 97.
    7. Devolvemos la secuencia País + Dígitos.

Todo esto no impide que en el caso de cuentas españolas haya que validar los dígitos de control de los CCC. Espero que sea de utilidad.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Cálculo / Validación del IBAN Responder citando

Muchas gracias Ángel por este código, ya me empezaba a volver loco con este cambio SEPA
He estado cambiando programas para validar el iban y, si no te parece mal, me he permitido poner un validador, de tal forma que si el iban pasado no es correcto la función devuelva nulo. Si no se han especificado los 2 dígitos de control del iban o están correctos, devuelve pais+dc

Código:
String CalculaIban(String Cuenta, String Pais)
{
    String cAux,
    String dciban,Valor;                                 //<-----------------------   añadir
    if (Cuenta.Trim().IsEmpty() || Cuenta.Length() > 34)
        return "";

    Cuenta = UpperCase(Cuenta);
    /******** añadir 3 lineas para copiar el dciban *******/
    dciban="";
    if(Pais.Length()==4)
         dciban = Pais.SubString(3, 2);

    cAux = "";
    for (int nPos = 0; nPos < Cuenta.Length(); nPos ++)
        if (isalpha(Cuenta.c_str()[nPos]) || isdigit(Cuenta.c_str()[nPos]))
            cAux = cAux + String(Cuenta.c_str()[nPos]);

    Cuenta = cAux;
    if (isalpha(Cuenta.c_str()[0]) && isalpha(Cuenta.c_str()[1]))    // Es IBAN
    {
      if (isalpha(Cuenta.c_str()[2]) || isalpha(Cuenta.c_str()[3]))
            return "";

      // guarda el dciban desde cuenta
      dciban = Cuenta.SubString(3, 2);                         //<--------------------------   añadir
      Cuenta = Cuenta.SubString(5, Cuenta.Length()) + Cuenta.SubString(1, 2)+ "00";
      Pais   = Cuenta.SubString(1, 2);
      }
    else
    {
        if (Pais.IsEmpty())
            Pais = "ES";
            dciban="";                                       //<----------------------------   añadir
        Cuenta = Cuenta + Pais + "00";
    }

    cAux = "";
    for (int nPos = 1; nPos <= Cuenta.Length(); nPos ++)
    {
        if (isalpha(Cuenta.c_str()[nPos - 1]))
            cAux = cAux + FormatFloat("00", Cuenta.c_str()[nPos - 1] - 55);
        else
            cAux = cAux + Cuenta.SubString(nPos, 1);
    }
    Cuenta = cAux;

    cAux   = FormatFloat("0", StrToInt(Cuenta.SubString(1, 9)) % 97);
    Cuenta = Cuenta.SubString(10, Cuenta.Length());
    while (!Cuenta.IsEmpty())
    {
        if (StrToInt(cAux) < 10)
        {
            cAux   = cAux + Cuenta.SubString(1, 8);
            Cuenta = Cuenta.SubString(9, Cuenta.Length());
        }
        else
        {
            cAux   = cAux + Cuenta.SubString(1, 7);
            Cuenta = Cuenta.SubString(8, Cuenta.Length());
        }
        cAux = FormatFloat("0", StrToInt(cAux) % 97);
    }
    /*************  3 lineas añadidas y la final modificada **********/
   Valor=FormatFloat("00", 98 - StrToInt(cAux));

   if(dciban!="")  // si hay dciban y está mal retorna nulo
         if(Valor!=dciban) return "";

    return Pais + Valor;
}


Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Re: Cálculo / Validación del IBAN Responder citando

bosoft escribió:
Muchas gracias Ángel por este código, ya me empezaba a volver loco con este cambio SEPA
He estado cambiando programas para validar el iban y, si no te parece mal, me he permitido poner un validador, de tal forma que si el iban pasado no es correcto la función devuelva nulo. Si no se han especificado los 2 dígitos de control del iban o están correctos, devuelve pais+dc

¿Por qué iba a parecerme mal? Cualquier mejora es bienvenida.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.