Buenas a tod@s, con esta sencilla función podréis calcular el famoso IBAN que entra en vigor el día 1 de febrero de 2014.
Perdonar que no comentara desde el primer momento el post, pero sinceramente no pensé que fuera a recibir visitas tan rápido, lo que me ha sorprendido gratamente. Voy a explicar un poco de que va esto del IBAN y como se calcula y os dejo el código abajo. |
Según las especificaciones de la norma ISO 13616 IBAN “Código Internacional de Cuenta Bancaria”, la norma EBS 204 “Código Internacional de Cuenta Bancaria” y la norma SIG 203 “Código Internacional de Cuenta Bancaria. Directrices de Implantación Normalizada”, la AEB ha publicado una circular para conocimiento y divulgación entre entidades de crédito y clientes de la definición y adaptación del IBAN para cuentas en España, con el objeto de que las entidades de crédito comiencen a distribuir este dato durante el primer semestre de 2000 entre sus clientes que realicen operaciones transfronterizas, para posteriormente abordar su incorporación a los cheques y pagarés de cuenta corriente, órdenes de transferencia y su tratamiento por las aplicaciones y sistemas interbancarios.
El Comité Europeo de Normalización Bancaria (ECBS), ha publicado la norma ECBS 204 que ofrece un código de identificación internacional y normalizado de cuenta: el Código internacional de Cuenta Bancaria (IBAN, en sus siglas en inglés, International Bank Account Number), para la identificación de una cuenta abierta en una entidad de crédito, con el fin de facilitar el tratamiento automatizado de operaciones (transfronterizas).
El IBAN puede implantarse en los distintos países sin modificar los códigos o formatos de cuentas nacionales (En España el Código Cuenta Cliente — C.C.C.) Ello se logra creando un prefijo estándar, tras el cual puede colocarse inalterado el código de cuenta nacional.
A efectos de definición del IBAN aplicable a las cuentas abiertas en entidades de crédito en España, en los apartados siguientes se desarrollan los criterios sobre su configuración, datos que lo integran, métodos de cálculo y validación de los dígitos de control y expresión en formato electrónico y en papel.
El IBAN español estará formado por 24 posiciones alfanuméricas, según sigue:
— 2 posiciones alfabéticas indicativas del país. Será siempre ES. (El código de país de dos letras se corresponde con los de la norma ISO 3166, que para España es ES).
— 2 dígitos de control. Según fórmulas de cálculo y validación que se indican más adelante.
— 20 posiciones numéricas. Constituidas por el actual Código Cuenta Cliente.
3. Método de cálculo y validación de los dígitos de control
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
Todo este royo lo he sacado de aquí.
Ahora el código en PHP, el problema principal a la hora de trabajar con números tan grandes en PHP es que se sufrirá un desbordamiento si los tratamos como enteros ya que en las plataformas de 32 bits, los valores enteros pueden ir desde -2147483648 hasta +2147483647, y en las plataformas de 64 bits desde 9223372036854775807 hasta -9223372036854775807.
Por ello debemos trabajar con cadenas y no podremos calcular el resto de la división utilizando el operador aritmético «%», sino que tendremos que usar la función bcmod() incluida en la extensión de matemáticas de precisión arbitraria BC Math, la cual está incluida en el lenguaje de forma nativa a partir de la versión 4.0.4, por lo que si tienes una versión anterior de PHP deberás instalar esta extensión aparte.
Después de todo el royo que os he soltado, aquí os dejo la función en cuestión.
function calcularIBAN($codigoPais,$ccc){ $pesos = array('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' ); $dividendo = $ccc.$pesos[substr($codigoPais, 0 , 1)].$pesos[substr($codigoPais, 1 , 1)].'00'; $digitoControl = 98 - bcmod($dividendo, '97'); if(strlen($digitoControl)==1) $digitoControl = '0'.$digitoControl; return $codigoPais.$digitoControl.$ccc; }
Un ejemplo de uso sería :
//Atentos a pasar la cuenta como un String y no como una constante o entero. echo calcularIBAN('ES','00120345030000067890');
Lo que nos devolvería ES0700120345030000067890
Espero que os sea útil a tod@s.
Un saludo.
Buenas tardes Fernando, antes de nada muchas gracias por tu aporte, he probado tu función y no me acaba de funcionar bien… por ejemplo la he comprobado para una cuenta de España: y el resultado obtenido no me coincide con la validación de Bankinter y otras webs que si que concuerdan, creo que debe ser por algún problema con la función bcmod… es una cuenta de LA CAIXA (2100), de todas formas seguiré buscando alguna solución, si encuentro algo ya te lo diré.
Saludos.
Hola Chema, puede ser porque la función que dices se incluyó en el lenguaje desde la versión 4.0.4 creo recordar. Si tienes una versión anterior de PHP tienes que instalar el mmódulo bcmath. Voy camino del gym cuando vuelva explicaré la función con detenimiento. Un saludo.
Estoy usando la versión 5.4.3 de PHP… investigo y te digo. Que te sea leve en el gym 😛
Hola Chema, ya he actualizado el post, espero que te aclare algo. Un saludo.
Buenos días Fernando, perdón por todas las molestias ya se cual era el error… el nombre de una variable… formateo los datos para que tengan el siguiente formato 0000-0000-00-0000000000
pero en uno de los formateos cambie el nombre de una variable sin darme cuenta y a la ultima parte del nº de cuenta le faltaba un dígito a la izquierda… en vez de tener un nº de cuenta de 20 caracteres lo tenia de 19 por lo tanto no obtenia el IBAN correcto, lo dicho el script funciona y la explicación correcta.
Me alegro de que te lo solucionaras y que te haya sido de ayuda. Un saludo.
[…] 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 […]
Perfectísimo. Gracias!
😀 De nada, me alegro de que te sirviera.
Muchísimas gracias Fernando!!!
De nada Jordi, me alegra que te haya sido útil.
Gracias! superutil , super secillo
Me alegra que te haya sido útil! Un saludo.
In other cases, these agreements would be the standard form of real estate property lending within their
jurisdiction. Familiarize yourself with certain regulations in terms of your restrictions on abandoned properties in storage facilities.
If you take your time and effort to look around and do your research then committing to US Property can a
secure and profitable experience.