Credit Card Validation in C#
March 7th, 2009
| Tags: C#, validation
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
public sealed class Card_Validation
{
string MasterCard, BankCard, Visa, AmericanExpress, Discover, DinersClub, JCB;
private Card_Validation()
{
} // static only
//public static bool Validate(CardType cardType, string cardNumber)
public static bool Validate(string cardType, string cardNumber)
{
byte[] number = new byte[16]; // number to validate
// Remove non-digits
int len = 0;
for(int i = 0; i 5)
return false;
break;
case “BankCard”:
if(len != 16)
return false;
if(number[0] != 5 || number[1] != 6 || number[2] > 1)
return false;
break;
case “Visa”:
if(len != 16 && len != 13)
return false;
if(number[0] != 4)
return false;
break;
case “AmericanExpress”:
if(len != 15)
return false;
if(number[0] != 3 || (number[1] != 4 && number[1] != 7))
return false;
break;
case “Discover”:
if(len != 16)
return false;
if(number[0] != 6 || number[1] != 0 || number[2] != 1 || number[3] != 1)
return false;
break;
case “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 “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);
}
}
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).
if(len == 16) return false; // number has too many digits
number[len++] =Convert.ToByte(cardNumber[i]);
Thanks for the code. You really saved me some time with this.
Can you please tell me if i have a Text box how will it be possible to send the text box text information through this class
public static bool Validate(CardType cardType, string cardNumber)
Can you build the different classes used to validate each card. I was thinking that a separate class for each card would be needed for validation.