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.
- 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.
- Se convierte la cadena a mayúsculas y se desprecia todo lo que no sean letras o dígitos.
- 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.
- 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.
- 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.
- Calculamos los dígitos de control de acuerdo con el módulo 97.
- 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.