Hola a tod@s, como ya os comenté en la función para PHP, el cálculo del nuevo IBAN requiere un tratamiento especial a la hora de hacer las operaciones matemáticas debido a que el uso de números excesivamente largos produce un desbordamiento.
Os voy a recordar un poco como se calcula el IBAN de forma genérica. |
El Cálculo se llevará a cabo de la siguiente forma:
Paso preliminar: Crear un código previo de IBAN compuesto del código de país (ES) seguido de “00” y el C.C.C.
Ejemplo: ES0000120345030000067890
Paso 1: Trasladar los cuatro primeros caracteres del IBAN a la derecha del Código:
Resultado: 00120345030000067890ES00
Paso 2: Convertir las letras en números aplicando: E = 14; S = 28.
Resultado: 00120345030000067890142800
La conversión de letras por números, para el caso de IBAN de otros países se acomoda a la siguiente tabla:
A = 10 | B=11 | C=12 | D=13 | E=14 |
F=15 | G=16 | H=17 | I=18 | J=19 |
K=20 | L=21 | M=22 | N=23 | O=24 |
P=25 | Q=26 | R=27 | S=28 | T=29 |
U=30 | V=31 | W=32 | X=33 | Y=34 |
Z=35 |
Paso 3: Aplicar el módulo 97 – 10 (ISO 7604)
Calculando el módulo 97 (resto de la división por 97 del IBAN creado)
y estableciendo la diferencia entre 98 y el resto. Si el resultado es un dígito, anteponer un cero.
98 – 91= 7
El IBAN creado sería: IBAN ES07 0012 0345 03 0000067890
Para el caso de JAVA es necesario el uso de la clase BigIngeter incluida en el paquete java.math.
Ante la imposibilidad de java de declarar los índices de sus arrays como char he creado la función static String damePesoIBAN(char letra) que tiene como misión devolvernos el peso correspondiente a cada carácter del código de país.
También he rescatado de otro código el método static String ponCerosIzquierda(String str,int longitud) ya que me parecía más simple y rápido de implementar que utilizar la clase Formatter, que nos ofrece más versatilidad, pero para el propósito que aquí nos compete nos sobra y basta con la función ponCerosIzquierda.
package TU_PACKAGE; import java.math.BigInteger; /** * * @author Fernando Rodríguez-Izquierdo Serrano */ class calculaIBAN { static String getIban(String codigoPais,String entidad,String oficina,String dc,String numeroCuenta){ String dcIban = calculaDcIban(codigoPais,entidad,oficina,dc,numeroCuenta); String iban = codigoPais+dcIban+entidad+oficina+dc+numeroCuenta; return iban; } static String calculaDcIban(String codigoPais,String entidad,String oficina,String dc,String numeroCuenta){ String preIban = entidad+ oficina+ dc+ numeroCuenta+ damePesoIBAN(codigoPais.charAt(0))+ damePesoIBAN(codigoPais.charAt(1))+ "00"; BigInteger ccc = new BigInteger(preIban); BigInteger noventaysiete = new BigInteger("97"); ccc = ccc.mod(noventaysiete); int dcIb = ccc.intValue(); dcIb = 98 - dcIb; return ponCerosIzquierda(Integer.toString(dcIb),2); } static String ponCerosIzquierda(String str,int longitud){ String ceros = ""; if(str.length()
Buenas Fernando,
Antes de nada agradecerte tu aportación, es de gran ayuda..
Comentarte que hay que hacer una mínima corrección al método «getIban», ya que no se están mostrando los dígitos de control del IBAN en la cadena resultado:
– código original: String iban = codigoPais+entidad+oficina+dc+numeroCuenta;
– código modificado: String iban = codigoPais+dcIban+entidad+oficina+dc+numeroCuenta;
Cierto Edmundo, tienes razón. Ya está corregido.
Hola Fernando
He tenido que alterar un poco la clase para adaptarla a nuestras necesidades pero me he encontrado que cuando la cuenta empieza por 0 agrega incorrectamente el ES, según tu código lo añade dos veces y he añadido un pequeño control:
Cuando devuelve el dcIban compruebo que no lleva un ES y si lo lleva no lo añado:
if(dcIban.contains(«ES»)){
iban = dcIban;
}else{
iban = «ES»+dcIban;
}
Cuenta ejemplo: ES0420387055936000144351
Si me equivoco perdona mi torpeza.
Saludos
He de añadir que para mi caso solo necesito el IBAN «ES04» por lo que no añado el resto del string.
Hola Fernando y muchas gracias ante todo,
Comparto el código simplificado que he creado a partir de tu aportacion por si le sirve a alguien:
//Doy por hecho inicializar las variables, etc.
//Parto de que pido los 20 numeros de cuenta en un string y lo guardo en aux
iban=aux+»142800″;
bnum=new BigInteger(iban);
bnum=bnum.mod(noventaysiete);
digcontrol=98-bnum.intValue();
dc=Integer.toString(digcontrol);
if(aux.length()<2)
{
iban="ES0"+dc+aux;
}else
{
iban="ES"+dc+aux;
}
//Aquí se puede devolver el string iban ya formado.
Muchas gracias Fernando!!! Lo he implementado y me está funcionando correctamente para países como España y Portugal. Sin embargo, para por ejemplo Italia las cuentas tienen un código de verificación por delante de la cuenta, ¿cómo se calcularía éste IBAN? no encuentro información acerca de ello, por ejemplo: la cuenta X0542811101000000123456 el IBAN es IT60X0542811101000000123456. ¿Habrá que sustituir la X por el valor previamente y realizar el algoritmo?
Un saludo