This code validates credit card numbers based on prefix, length, and the Luhn Algorithm.
using System;
public enum CardType
{
MasterCard, BankCard, Visa, AmericanExpress, Discover, DinersClub, JCB
};
public sealed class CardValidator
{
private CardValidator() {} // static only
public static bool Validate(CardType cardType, string cardNumber)
{
byte[] number = new byte[16]; // number to validate
// Remove non-digits
int len = 0;
for(int i = 0; i < cardNumber.Length; i++)
{
if(char.IsDigit(cardNumber, i))
{
if(len == 16) return false; // number has too many digits
number[len++] = byte.Parse(cardNumber[i]);
}
}
// Validate based on card type, first if tests length, second tests prefix
switch(cardType)
{
case CardType.MasterCard:
if(len != 16)
return false;
if(number[0] != 5 || number[1] == 0 || number[1] > 5)
return false;
break;
case CardType.BankCard:
if(len != 16)
return false;
if(number[0] != 5 || number[1] != 6 || number[2] > 1)
return false;
break;
case CardType.Visa:
if(len != 16 && len != 13)
return false;
if(number[0] != 4)
return false;
break;
case CardType.AmericanExpress:
if(len != 15)
return false;
if(number[0] != 3 || (number[1] != 4 && number[1] != 7))
return false;
break;
case CardType.Discover:
if(len != 16)
return false;
if(number[0] != 6 || number[1] != 0 || number[2] != 1 || number[3] != 1)
return false;
break;
case CardType.DinersClub:
if(len != 14)
return false;
if(number[0] != 3 || (number[1] != 0 && number[1] != 6 && number[1] != 8)
|| number[1] == 0 && number[2] > 5)
return false;
break;
case CardType.JCB:
if(len != 16 && len != 15)
return false;
if(number[0] != 3 || number[1] != 5)
return false;
break;
}
// Use Luhn Algorithm to validate
int sum = 0;
for(int i = len - 1; i >= 0; i--)
{
if(i % 2 == len % 2)
{
int n = number[i] * 2;
sum += (n / 10) + (n % 10);
}
else
sum += number[i];
}
return (sum % 10 == 0);
}
}


can you provide C# code to generate valide credit cards??
regards,
Nitin Sawant
Your Luhn algorithm is interesting, but according to my tests is 10x slower than this one:
http://orb-of-knowledge.blogspot.com/2009/08/extremely-fast-luhn-function-for-c.html
Also, line #23 is not compiling for me, as it complains that Byte.Parse cannot take a char, but must take a string. I then had to call .ToString() on the char value to make it work (which may account for some of the slowness mentioned above).
Thanks for the code. You really saved me some time with this.