06 marzo 2006

Comprobación del dígito de control del IBAN

En este script, partimos de la premisa de disponer del IBAN formateado adecuadamente, así iremos al grano, y dejo que cada cual utilice las comprobaciones que considere oportunas para ver si el IBAN tiene el formato adecuado. Para concretar más el formato utilizado para el ejemplo será AANNCCCCCCCCCCCCCCCCCCCC, donde:

  • AA: Código del país de la entidad (Letras en mayúsculas).
  • NN: Dígito de control del IBAN (Números).
  • CCCCCCCCCCCCCCCCCCCC: Número de cuenta.

En primer lugar convertimos las letras a números, contando que la A vale 10, la B vale 11 y así sucesivamente, de tal modo que BE62510007547061 quedaría 111462510007547061.


ls_letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ls_aux = string(pos(ls_letras, left(as_IBAN, 1))+9)
ls_aux += string(pos(ls_letras, mid(as_IBAN, 2, 1))+9)


En segundo paso consiste en mover los primeros seis caracteres a la derecha de tal modo que 111462510007547061 quedará 510007547061111462:


as_IBAN = mid(as_IBAN, 5) + ls_aux + mid(as_IBAN, 3, 2)


Y para finalizar hay que comprobar si el resto de la división del número obtenido entre 97 es 1. Si el resultado fuese distinto, el dígito de control sería incorrecto.


mod(double(as_IBAN), 97)


En este último punto hay un temita que puede tenerse en cuenta, y es que por razones de precisión se recomienda realizar esta operación con números enteros y no fraccionados o decimales, y como pordrá comprobarse el número con el que hay que operar es mayor que el que se puede almacenar en un unsignedlong (mayor entero en PB), como un entero de 32 bits o 64 bits representa un máximo de 9 ó 18 dígitos, se puede realizar la operación por partes tal y como describo a continuación:

  1. Cálculo del módulo 97 de los primeros 9 dígitos del número.

    Ej: mod(510007547, 97) = 74
  2. Construcción del siguiente entero de 9 dígitos, colocando en primer lugar el resultado del paso anterior. seguido por los siguientes 7/8 dígitos del número y calcular el módulo 97.

    Ej: mod(740611114, 97) = 12.
  3. Repetir el paso dos hasta que todos los dígitos del número hayan sido procesados. Ej: mod(1262, 97) = 1

4 comentarios:

Anónimo dijo...

Hola:

Ando como loco buscando en internet no la comprobación de si los dígitos de control de una cuenta IBAN son correctos o no, sino el algoritmo para, partiendo del CCC saber qué los dígitos de control del IBAN ¿sabes algo?

Un cordial saludo,

Michel Pérez dijo...

El Comité Europeo para estándares de Bancos (ECBS) es quien determina la normativa correspondiente al calculo, chequeo y demás menesteres, y concretamente la norma que regula la información asociada al International Bank Account Number (IBAN) es la EBS204 v3.2 de Agosto del 2003.

Hay un pdf colgado en la página del citado comité que te puedes descargar para resolver tu duda... es la fuente original, así que mejor que ellos nadie puede indicarte.

Saludos y espero haber podido ayudarte.

P.D.: La dirección del pdf es: http://www.ecbs.org/Download/EBS204_V3.2.pdf

Carcarher dijo...

Gracias Miguel. Leyendo el documento creé dos funciones en VBA (Visual Basic para aplicaciones) utilizado en Microsoft Access y la suite Office, copio aquí por si es de interés para alguien:

Las siguientes 2 funciones nos permiten:

1. Verificar si un número de cuenta IBAN (cuenta bancaria internacional) perteneciente a un banco español, es correcta, es decir cumple los estándares de los dígitos de control de la misma.

Function VerificarIBAN(IBAN As String) As String
VerificarIBAN = CalcularModulo(Mid(IBAN, 5) & "1428" & Mid(IBAN, 3, 2), 97)
End Function

La función devuelve el caracter 1 (uno) si es válida, cualquier otro valor, si no lo es.


2. Devuelve el número de la cuenta IBAN (24 caracteres) pasándole el número de la cuenta de la cuenta bancaria española (20 caracteres):

Function HallarIBAN(CCC As String) As String
Dim DigControl As String

DigControl = 98 - CalcularModulo(CCC & "142800", 97)

HallarIBAN = "ES" & Format(DigControl, "00") & CCC
End Function

3. Ambas funciones hacen uso de esta tercera función, que es capaz de hallar el módulo 97 de un número, algo que, la función MOD de Access no es capaz de hacer para números tan grandes.

Function CalcularModulo(Numero As String, Modulo As Integer) As String
Dim Dividendo As Long
Dim VoyPor As Integer
Dim Resto As Integer

VoyPor = 1

Do While VoyPor <= Len(Numero)
Dividendo = Resto & Mid(Numero, VoyPor, 1)
Resto = Dividendo Mod Modulo
VoyPor = VoyPor + 1
Loop
CalcularModulo = Resto
End Function

Michel Pérez dijo...

Hola Carcar:

Gracias por tu "post-comentario" con el código para que puedan utilizarlo nuestros amigos de VBA (Visual Basic for Applications). Seguro que le es útil a más de uno.