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
Posiciones Impares
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 paresPosiciones Impares
- 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 - 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 - Si el resto de dividir el total entre 10 es igual a cero, el número es correcto:
70 mod 10 = 0
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; } }
Buenos dias, el codigo en C# da error en el ForEach. ¿Hay que agregar un referencia?
ResponderEliminarPudiste resolverlo? y si es asi mandamelo porfa francinakiss1@gmail.com
EliminarLlega tarde fijo, pero por si a alguno le sirve, cambiar el bucle por:
ResponderEliminarforeach (char c in creditCardNumber.Where(c => char.IsDigit(c)))
{
digitsOnly.Append(c);
}