public static void Main()
Console.WriteLine("AMEX VALID: " + LuhnAlgorithm.ValidateCheckDigit("371449635398431"));
Console.WriteLine("AMEX INVALID: " + LuhnAlgorithm.ValidateCheckDigit("371449635398439"));
Console.WriteLine("MC VALID: " + LuhnAlgorithm.ValidateCheckDigit("5454545454545454"));
Console.WriteLine("MC INVALID: " + LuhnAlgorithm.ValidateCheckDigit("5454545454545456"));
Console.WriteLine("MC Corporate VALID: " + LuhnAlgorithm.ValidateCheckDigit("5132850000000008"));
Console.WriteLine("MC Corporate INVALID: " + LuhnAlgorithm.ValidateCheckDigit("5132850000000009"));
Console.WriteLine("MC Fleet VALID: " + LuhnAlgorithm.ValidateCheckDigit("5567356006664742"));
Console.WriteLine("MC Fleet INVALID: " + LuhnAlgorithm.ValidateCheckDigit("5567356006664744"));
Console.WriteLine("VISA VALID: " + LuhnAlgorithm.ValidateCheckDigit("4055011111111111"));
Console.WriteLine("VISA INVALID: " + LuhnAlgorithm.ValidateCheckDigit("4055011111111114"));
Console.WriteLine("DISCOVER VALID: " + LuhnAlgorithm.ValidateCheckDigit("6011000995500000"));
Console.WriteLine("DISCOVER INVALID: " + LuhnAlgorithm.ValidateCheckDigit("6011000995500009"));
Console.WriteLine("US DEBIT EBT VALID: " + LuhnAlgorithm.ValidateCheckDigit("9999999800002773"));
Console.WriteLine("US DEBIT EBT INVALID: " + LuhnAlgorithm.ValidateCheckDigit("9999999800002775"));
public static class LuhnAlgorithm
private static readonly Int32[] _doubledValues = new Int32[] { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 };
public static Boolean ValidateCheckDigit(String str)
if (String.IsNullOrEmpty(str) || str.Length < 2)
var shouldApplyDouble = true;
for (var index = str.Length - 2; index >= 0; index--)
var currentDigit = str[index] - '0';
if (currentDigit < 0 || currentDigit > 9)
sum += shouldApplyDouble ? _doubledValues[currentDigit] : currentDigit;
shouldApplyDouble = !shouldApplyDouble;
var checkDigit = (10 - (sum % 10)) % 10;
return str[^1] - '0' == checkDigit;