FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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 y 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)); } //--------------------------------------------------------------------------- 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) |
#2
|
||||
|
||||
Hola Angel.
Gracias por el aporte . Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
||||
|
||||
Gracias por el aporte y la documentación.
__________________
http://www.gestionportable.com |
#4
|
||||
|
||||
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)); }
|
#5
|
||||
|
||||
Muchas gracias por el aporte.
Para los que usamos Delphi en vez de C++ Builder, les dejo la "traducción" de la función a Pascal.
__________________
Progress Openedge https://abevoelker.com/progress_open...dered_harmful/ Delphi forever... |
#6
|
|||
|
|||
Gracias por los aportes.
Si se le pasa un IBAN para comprobar sus dígitos de control la función fallaría (incluso la de C++), hay que revisar el paso 2 cuando ya es un IBAN. Aquí les propongo mis modificaciones:
|
#7
|
|||
|
|||
Muchas gracias por el aporte, me viene de perlas.
Saludos |
#8
|
|||
|
|||
Gracias por la aportación.
Solo una cosilla, el codigo del pais en el caso de ser una cuenta IBAN debe tomarse antes de la modificacion de la cuenta [quote=Angel.Matilla;469275]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:
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 ""; Pais = Cuenta.SubString(1, 2); Cuenta = Cuenta.SubString(5, Cuenta.Length()) + Cuenta.SubString(1, 2) + "00"; } else { if (Pais.IsEmpty()) Pais = "ES"; Cuenta = Cuenta + Pais + "00"; } |
#9
|
||||
|
||||
Tienes razón en tu puntualización. No osbtante, y es culpa mía, el código de país es uno de los parámetros que se pasan a la función.
|
#10
|
||||
|
||||
Cita:
|
#11
|
||||
|
||||
¿Cálculo de la Identificación de Acreedor?
¿Alguien tiene hecho el cálculo de la Identificación de Acreedor para las domiciliaciones en formato SEPA?.
Uno de los pasos es tomar el resto de la división de un numero de p.e. 1185626240142800 entre 97. Dicho número sale de formar un string según varias formulas. Pues el caso es que no se como hacer esa división, ya que no se puede a entero para realizar un mod y obtener el resto. Ando espeso espeso. Se agradecen sugerencias. La explicación completa y más clara que la mía aquí.
__________________
http://www.gestionportable.com |
#12
|
||||
|
||||
Bueno, dejé de obsesionarme con hacerlo de una forma más directa y estoy haciendolo así
__________________
http://www.gestionportable.com |
#13
|
||||
|
||||
Cita:
Código:
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)); |
#14
|
||||
|
||||
Gracias Angel.Matilla, pero mi problema no es con el IBAN ya que las formulas que habeis puesto funcionan bien.
El error ha sido mío por no abrir otro hilo, pero como en el fondo si guarda relación por eso lo he comentado aquí. El problema es que al hacer las domiciliaciones bancarias hay que calcular la Identificación de Acreedor de acuerdo a la fórmula que comenté antes partiendo del Pais, un sufijo (000) y el CIF. Esto nos da en un determinado momento un número entero de 16 dígitos del que hay que sacar el resto de la división entre 97 y ese cálculo excedía el rango numérico de los enteros que conocía (nunca usé ningún entero mayor que longInt). Acabo de ver que hay un Int64 y un StrToInt64 que no sabía que existían. Con eso supongo que me arreglaré. Cuando lo tenga funcionando publicaré el código en un nuevo hilo.
__________________
http://www.gestionportable.com |
#15
|
||||
|
||||
Vale. También tengo el código para hacer el cálculo a partir del CIF. Es este, en Builder:
Para el primer registro obligatorio del Cuaderno 19-14 Código:
String Registro; Regsitro = "0119143001" + AjustaCadena("ES" + Modulo9710(cIdPre + "ES00") + cSufPre + cIdPre, ' ', 35, 'D') + AjustaCadena(cTitPre, ' ', 70, 'D') + Date().FormatString("yyyymmdd") + AjustaCadena("PRE" + Now().FormatString("yyyymmddhhnnss00000") + cRefInt + Now().FormatString("yymm"), ' ', 35, 'D') + cCtaPre.SubString(5, 8) + AnsiString::StringOfChar(' ', 434));
Código:
AnsiString AjustaCadena(AnsiString cCadena, char cRelleno, int nLong, char cJust) { cCadena = Trim(cCadena.SubString(1, nLong)); switch (cJust) { case 'I': cCadena = AnsiString::StringOfChar(cRelleno, nLong - cCadena.Length()) + cCadena; break; case 'C': cCadena = AnsiString::StringOfChar(cRelleno, (nLong - cCadena.Length())/2) + cCadena + AnsiString::StringOfChar(cRelleno, (nLong - cCadena.Length())/2); if (cCadena.Length() < nLong) cCadena += AnsiString(cRelleno); break; case 'D': cCadena = cCadena + AnsiString::StringOfChar(cRelleno, nLong - cCadena.Length()); break; } return (cCadena); } Código:
AnsiString Modulo9710(AnsiString Cadena) { AnsiString cValor; cValor = ""; for (int nPos = 1; nPos <= Cadena.Length(); nPos ++) { if (isalpha(Cadena.c_str()[nPos - 1])) cValor = cValor + FormatFloat("00", Cadena.c_str()[nPos - 1] - 55); else cValor = cValor + Cadena.SubString(nPos, 1); } Cadena = cValor; cValor = FormatFloat("0", StrToInt(Cadena.SubString(1, 9)) % 97); Cadena = Cadena.SubString(10, Cadena.Length()); while (!Cadena.IsEmpty()) { if (StrToInt(cValor) < 10) { cValor = cValor + Cadena.SubString(1, 8); Cadena = Cadena.SubString(9, Cadena.Length()); } else { cValor = cValor + Cadena.SubString(1, 7); Cadena = Cadena.SubString(8, Cadena.Length()); } cValor = FormatFloat("0", StrToInt(cValor) % 97); } return cValor; } Última edición por Angel.Matilla fecha: 05-02-2014 a las 11:11:53. |
#16
|
||||
|
||||
Cita:
|
#17
|
||||
|
||||
Voy a probar, aunque veo que la forma de calcularlo es distinta a la que yo había encontrado y no se dan números enteros tan largos. Y lo del sufijo ya lo tengo en cuenta,
__________________
http://www.gestionportable.com |
#18
|
||||
|
||||
Para hacer el cálculo seguí las sugerencias que encontré en una web; no recuerdo si es la del enlace que puse más arriba. Si se puede trabajar con la cadena completa se hace de una vez.
|
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Cálculo de los dígitos IBAN | Troffed | Trucos | 9 | 26-07-2020 18:08:27 |
validación | Nelly | Varios | 8 | 12-10-2005 19:32:33 |
validacion | halifax | Tablas planas | 7 | 06-02-2005 23:25:53 |
Validacion | Carlex | Conexión con bases de datos | 1 | 08-09-2004 23:53:41 |
Como calcular codigo IBAN | cinecito | Varios | 2 | 11-05-2004 18:49:44 |
|