Validación de Tarjetas de Crédito en C# - Algoritmo de Luhn

Algoritmo de Luhn

El algoritmo de Luhn es un método creado para la verificación de números de identificación, como los números de las tarjetas de crédito (Visa, MasterCard) o el IMEI de los teléfonos móviles.

Su creador fue Hans Peter Luhn, un científico de IBM y su uso ha sido tan extendido que desde que fuera creado hoy controla la creación y validación de todos los plásticos que se otorgan a los que poseen tarjetas de crédito de todo el mundo.

Este algoritmo es muy simple, nos dice que dada un número que contenga solamente dígitos [0-9], una tarjeta de crédito es válida si y solo si, obteniendo la reversa de este número, y la suma sus dígitos debe ser un múltiplo de 10, es decir que la suma módulo 10 debe ser igual a cero.

La forma en sumar es la siguiente, una vez hayamos invertido el número, si es posición impar, sumamos el dígito, si es posición impar, multiplicamos ese dígito por dos y sumamos los dígitos de ese número, para hacerlo más práctico, si el doble de ese dígito es mayor o igual a 10, le restamos 9 a ese doble, y finalmente se debe verificar que la suma que se realizó sea un múltiplo de 10.

Funcionamiento del Algoritmo de Luhn


Ejemplo, dado el número 49927398716.
Leyenda:
      Posiciones pares
      Posiciones Impares
  1. Multiplicamos por 2 los dígitos que ocupan las posiciones pares empezando por el final:
    (1×2) = 2, (8×2) = 16, (3×2) = 6, (2×2) = 4, (9×2) = 18
  2. Sumamos los dígitos que ocupaban las posiciones impares con los dígitos de los productos obtenidos:
    6 + (2) + 7 + (1+6) + 9 + (6) + 7 + (4) + 9 + (1+8) + 4 = 70
  3. Si el resto de dividir el total entre 10 es igual a cero, el número es correcto:
    70 mod 10 = 0
Algoritmo de Luhn

Código en C# del Algoritmo de Luhn


public static class LuhnAlgorithm
{
    public static bool CheckCreditCard(string creditCardNumber)
    {
        StringBuilder digitsOnly = new StringBuilder();
        creditCardNumber.ForEach(c =>
        {
            if (Char.IsDigit(c)) digitsOnly.Append(c);
        });

        if (digitsOnly.Length > 18 || digitsOnly.Length < 15) return false;

        int sum = 0;
        int digit = 0;
        int addend = 0;
        bool timesTwo = false;

        for (int i = digitsOnly.Length - 1; i >= 0; i--)
        {
            digit = Int32.Parse(digitsOnly.ToString(i, 1));
            if (timesTwo)
            {
                addend = digit * 2;
                if (addend > 9)
                    addend -= 9;
            }
            else
                addend = digit;
                
            sum += addend;

            timesTwo = !timesTwo;

        }
        return (sum % 10) == 0;
    }
}

Comentarios

  1. Buenos dias, el codigo en C# da error en el ForEach. ¿Hay que agregar un referencia?

    ResponderEliminar
    Respuestas
    1. Pudiste resolverlo? y si es asi mandamelo porfa francinakiss1@gmail.com

      Eliminar
  2. Llega tarde fijo, pero por si a alguno le sirve, cambiar el bucle por:

    foreach (char c in creditCardNumber.Where(c => char.IsDigit(c)))
    {
    digitsOnly.Append(c);
    }

    ResponderEliminar

Publicar un comentario