 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 31 Oct, 2013 1:17 pm Asunto: Cálculo / Validación del IBAN |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 04 Nov, 2013 11:38 am Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Dom 17 Nov, 2013 1:55 pm Asunto: Cálculo / Validación del IBAN |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 18 Nov, 2013 10:15 am Asunto: Re: Cálculo / Validación del IBAN |
|
|
| 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|