Blog alskare

.Net y lo que surja

Validar número de cuenta bancaria española

Posted by alskare en 20/07/2009

Ya hacía tiempo que no posteaba nada, así que ya va siendo hora que contribuya con alguna cosa. En esta ocasión, le toca el turno a una función que he tenido que realizar para validar una cuenta bancaria. Por la vagancia que nos suele caracterizar, había encontrado alguna cosa por Internet, pero debo decir que tuve problemas a la hora de aplicar en serio la función, sobre todo, por desbordamientos.

En la elaboración de la misma me he ido encontrando con algún que otro tropiezo, puesto que me ha dado la cabezonería de meterme en C# y, claro, después de tanto tiempo con mi querido VB, hay ocasiones en las que me quedo en blanco. No sé, una vez que está todo hecho, lo veo la mar de fácil, pero he tenido ciertos problemas con las costumbres del namespace Microsoft.VisualBasic (Os prometo que he estado un rato para hacer una función IsNumeric).

Bueno, el caso es que ya está hecho y aquí lo dejo por si hay alguien que pueda usarlo. He optado por la creación de una clase estática que incluye tres métodos públicos (Bendita sobrecarga) para intentar evitar las conversiones típicas:

// Cuenta bancaria completa. 20 dígitos
bool c1 = CuentasBancarias.ValidaCuentaBancaria("01230123010123456789");

// Separación de Banco, Oficina, Dc y cuenta en formato string
bool c2 = CuentasBancarias.ValidaCuentaBancaria("0123", "0123", "01", "0123456789");

// Separación de Banco, Oficina, Dc y cuenta en formato UInt64
bool c3 =  CuentasBancarias.ValidaCuentaBancaria(123, 123, 1, 12345);

Bueno, pues dejo el código. Si alguien encuentra algún error o algún modo de mejorarlo, no tiene más que decirlo.

using System;
using System.Text.RegularExpressions;

namespace jnSoftware.Validaciones
{

    /// <summary>
    /// Servicios de validación de las cuentas bancarias españolas
    /// </summary>
    public static class CuentasBancarias
    {

        /// <summary>
        /// Validación de una cuenta bancaria española
        /// </summary>
        /// <param name="banco">Código del banco en formato "0000"</param>
        /// <param name="oficina">Código de la sucursal en formato "0000"</param>
        /// <param name="dc">Dígito de control en formato "00"</param>
        /// <param name="cuenta">Número de cuenta en formato "0000000000"</param>
        /// <returns>true si el número de cuenta es correcto</returns>
        public static bool ValidaCuentaBancaria(string banco, string oficina, string dc, string cuenta)
        {
            // Se comprueba que realmente sean números los datos pasados como parámetros y que las longitudes
            // sean correctas
            if (!IsNumeric(banco) || banco.Length != 4)
                throw new ArgumentException("El banco no tiene un formato adecuado");

            if (!IsNumeric(oficina) || oficina.Length != 4)
                throw new ArgumentException("La oficina no tiene un formato adecuado");

            if (!IsNumeric(dc) || dc.Length != 2)
                throw new ArgumentException("El dígito de control no tiene un formato adecuado");

            if (!IsNumeric(cuenta) || cuenta.Length != 10)
                throw new ArgumentException("El número de cuenta no tiene un formato adecuado");

            return CompruebaCuenta(banco, oficina, dc, cuenta);
        }

        /// <summary>
        /// Validación de una cuenta bancaria española
        /// </summary>
        /// <param name="cuentaCompleta">Número de cuenta completa con carácteres numéricos y 20 dígitos</param>
        /// <returns>true si el número de cuenta es correcto</returns>
        public static bool ValidaCuentaBancaria(string cuentaCompleta)
        {
            // Comprobaciones de la cadena
            if (cuentaCompleta.Length != 20)
                throw new ArgumentException("El número de cuenta no el formato adecuado");

            string banco = cuentaCompleta.Substring(0, 4);
            string oficina = cuentaCompleta.Substring(4, 4);
            string dc = cuentaCompleta.Substring(8, 2);
            string cuenta = cuentaCompleta.Substring(10, 10);

            return ValidaCuentaBancaria(banco,oficina,dc,cuenta);

        }

        /// <summary>
        /// Validación de una cuenta bancaria española
        /// </summary>
        /// <param name="banco">Código del banco</param>
        /// <param name="oficina">Código de la oficina</param>
        /// <param name="dc">Dígito de control</param>
        /// <param name="cuenta">Número de cuenta</param>
        /// <returns>true si el número de cuenta es correcto</returns>
        public static bool ValidaCuentaBancaria(UInt64 banco, UInt64 oficina, UInt64 dc, UInt64 cuenta)
        {
            return ValidaCuentaBancaria(
                                banco.ToString("0000")
                                , oficina.ToString("0000")
                                , dc.ToString("00")
                                , cuenta.ToString("0000000000")
                                );
        }

        /// <summary>
        /// Comprueba que la cadena sólo incluya números
        /// </summary>
        /// <param name="numero">Cadena de texto en formato número</param>
        /// <returns>true si <paramref name="numero"/> contiene sólo números</returns>
        /// <remarks>No se contemplan decimales</remarks>
        private static bool IsNumeric(string numero)
        {
            Regex regex = new Regex("[0-9]");
            return regex.Match(numero).Success;
        }

        /// <summary>
        /// Una cuenta bancaria está validada si los dígitos de control calculados coinciden con los
        /// que se han pasado en los argumentos
        /// </summary>
        private static bool CompruebaCuenta(string banco, string oficina, string dc, string cuenta)
        {
            return GetDigitoControl("00" + banco + oficina) + GetDigitoControl(cuenta) == dc;
        }

        /// <summary>
        /// Obtiene el dígito de control de una cuenta bancaria. La función sólo devuelve un número
        /// que corresponderá a una de las dos opciones.
        ///     - Codigo + CódigoOficina
        ///     - CuentaBancaria
        /// </summary>
        private static string GetDigitoControl(string CadenaNumerica)
        {
            int[] pesos = { 1, 2, 4, 8, 5, 10, 9, 7, 3, 6 };
            UInt32 suma = 0;
            UInt32 resto;

            for (int i = 0  ; i < pesos.Length; i++)
            {
                suma += (UInt32)pesos[i] * UInt32.Parse(CadenaNumerica.Substring(i, 1));
            }
            resto = 11 - (suma % 11);

            if (resto == 10) resto = 1;
            if (resto == 11) resto = 0;

            return resto.ToString("0");
        }

    }
}

Los amigos de velasco.biz han creado una página en la que puede validarse una cuenta bancaria in-situ. Dicho de otra manera, puede probarse todo este código en la dirección http://www.velasco.biz/html/desarrollo/Validaciones.aspx

2 comentarios to “Validar número de cuenta bancaria española”

  1. Anónimo said

    Excelente, muchas gracias !!!!

  2. […] NIF, NIE, CIF Archivado en: C# — alskare @ 18:31 En el post anterior ( Validar número de cuenta bancaria española ) estuve creando un método que permitía validar una cuenta bancaria con la finalidad de poder […]

Sorry, the comment form is closed at this time.

 
A %d blogueros les gusta esto: