Skip to content

Instantly share code, notes, and snippets.

@jamietre
Created May 6, 2011 12:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jamietre/958863 to your computer and use it in GitHub Desktop.
Save jamietre/958863 to your computer and use it in GitHub Desktop.
Credit card validator
namespace CreditCards
{
public class CardValidation
{
public bool VerifyDate = true;
public string CardName;
public string CCNumber;
public string CCCSV;
public string CCName;
public string CCExp;
public string ErrorMessage;
public string CCType
{
get {return(_CCType);}
set {
switch(value) {
case "1":
case "vi":
_CCType="vi";
break;
case "2":
case "mc":
_CCType="mc";
break;
case "3":
case "am":
_CCType="am";
break;
}
}
} protected string _CCType="";
public string CCTypeName
{
get {
switch(CCType) {
case "vi":
return("Visa");
case "mc":
return("MasterCard");
case "am":
return("American Express");
default:
return("");
}
}
}
public int CCTypeID
{
get {
switch(CCType) {
case "vi":
return(1);
case "mc":
return(2);
case "am":
return(3);
default:
return(0);
}
}
set {
CCType=value.ToString();
}
}
public bool Validate()
{
string CCNum;
int CCNumberLeft;
int CCNumberLength;
int ShouldLength;
string CardType="";
int Missing;
string YearPart;
string MonthPart;
bool DateValid;
ErrorMessage="";
//# 1) Get rid of spaces and non-numeric characters.
CCNum = OnlyNumericSolution(CCNumber);
//# 2) Do the first four digits fit within proper ranges?
//# if so, who's the card issuer and how long should the number be?
CCNumberLeft = Convert.ToInt32(CCNum.Substring(0, 4));
CCNumberLength = Convert.ToInt32(CCNum.Length);
if (CCType == "") {
ErrorMessage = "You must select the credit card type.";
return(false);
}
if (CCNumberLeft >= 3000 && CCNumberLeft <= 3059) {
CardName = "Diners Club";
ShouldLength = 14;
} else if (CCNumberLeft >= 3600 && CCNumberLeft <= 3699) {
CardName = "Diners Club";
ShouldLength = 14;
} else if (CCNumberLeft >= 3800 && CCNumberLeft <= 3889) {
CardName = "Diners Club";
ShouldLength = 14;
} else if (CCNumberLeft >= 3400 && CCNumberLeft <= 3499) {
CardName = "American Express";
CardType = "am";
ShouldLength = 15;
} else if (CCNumberLeft >= 3700 && CCNumberLeft <= 3799) {
CardName = "American Express";
CardType = "am";
ShouldLength = 15;
} else if (CCNumberLeft >= 3528 && CCNumberLeft <= 3589) {
CardName = "JCB";
ShouldLength = 16;
} else if (CCNumberLeft >= 3890 && CCNumberLeft <= 3899) {
CardName = "Carte Blache";
ShouldLength = 14;
} else if (CCNumberLeft >= 4000 && CCNumberLeft <= 4999) {
CardName = "Visa";
CardType = "vi";
if (CCNumberLength > 14) {
ShouldLength = 16;
} else if (CCNumberLength < 14) {
ShouldLength = 13;
}
else {
ErrorMessage = "The number entered is not a valid Visa number.";
return(false);
}
}
else if (CCNumberLeft >= 5100 && CCNumberLeft <= 5599) {
CardName = "MasterCard";
CardType = "mc";
ShouldLength = 16;
}
else if (CCNumberLeft == 5610) {
CardName = "Australian BankCard";
ShouldLength = 16;
}
else if (CCNumberLeft == 6011) {
CardName = "Discover/Novus";
ShouldLength = 16;
} else {
ErrorMessage = "The number entered is not valid.";
return(false);
}
//'# 3) Is the number the right length?
if (CCNumberLength != ShouldLength) {
Missing = CCNumberLength - ShouldLength;
if (Missing < 0)
ErrorMessage = "The number entered is not a valid " + CCTypeName + " number.";
else
ErrorMessage = "<The number entered is not a valid " + CCTypeName + " number.";
return(false);
}
//'# 4) Does the number pass the Mod 10 Algorithm Checksum?
if (!((Mod10Solution(CCNum) && CCType == CardType))) {
ErrorMessage = "The credit card number entered is not valid.";
return(false);
}
//' Check date
if (VerifyDate)
{
if (CCExp.Length != 7)
{
ErrorMessage = "The date must be formatted like MM/YYYY.";
return (false);
}
YearPart = CCExp.Substring(3);
//Mid(CCExp, 4)
MonthPart = CCExp.Substring(0, 2);
//Left(CCExp, 2)
if (!(UserFunctions.IsNumeric(YearPart) && UserFunctions.IsNumeric(MonthPart)))
{
ErrorMessage = "The expiration date isn't a valid date.";
return (false);
}
DateValid = true;
if (DateTime.Now.Year > Convert.ToInt32(YearPart))
{
DateValid = false;
}
if (DateTime.Now.Year == Convert.ToInt32(YearPart) && DateTime.Now.Month > Convert.ToInt32(MonthPart))
{
DateValid = false;
}
if (!DateValid)
{
ErrorMessage = "The expiration date has passed.";
return (false);
}
}
return(true);
}
public string OnlyNumericSolution(string CCNumber) {
string result="";
char s;
for (int i=0;i<CCNumber.Length;i++) {
s=CCNumber.Substring(i,1).ToCharArray()[0];
if (s >='0' && s<='9') {
result+=s;
}
}
if (result.Length<13) {
result="0000000000000";
}
if (result.Length > 19)
{
result = result.Substring(0, 19);
}
return(result);
}
private bool Mod10Solution(string CCNumber) {
int CCNumberLength;
int Checksum=0;
int Location;
int Digit;
CCNumberLength = CCNumber.Length;
//'# Add even digits in even length strings
//'# or odd digits in odd length strings.
Location = 1 - (CCNumberLength % 2);
while (Location <= CCNumberLength) {
Checksum += Convert.ToInt32(CCNumber.Substring(Location, 1));
Location += 2;
}
//'# Analyze odd digits in even length strings
//'# or even digits in odd length strings.
Location = (CCNumberLength % 2);
while (Location < CCNumberLength) {
Digit = Convert.ToInt32(CCNumber.Substring(Location, 1)) * 2;
if (Digit < 10) {
Checksum += Digit;
} else {
Checksum += Digit - 9;
}
Location += 2;
}
//'# Is the checksum divisible by ten?
if (((double)Checksum / 10) == (double)Math.Truncate((double)Checksum / 10)) {
return(true);
} else {
return(false);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment