C# .NET - Credit card validation in C# CONSOLE Application

Asked By shreya verma
29-Sep-08 08:06 AM

M Doing this credit card validation..please help me to solve this..getting Errors.

using System;

using System.Collections.Generic;

using System.Text;

 

namespace CreditCardValidation

{

class CreditCardValidation

{

static void Main(string[] args)

{

string cardNumber = GetCreditcardNumber();

string CardType = Convert.ToString(GetCardType(cardNumber));

ValidateCreditCardNumber(cardNumber);

Console.ReadLine();

}

static string GetCreditcardNumber()

{

string creditCardNumber = null;

Console.WriteLine("Enter 16 digits credit card Number");

creditCardNumber = Console.ReadLine();

return (creditCardNumber);

}

public static bool ValidateCreditCardNumber(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);

}

bool Number = Convert.ToBoolean(number[len++]);

return (Number);

}

// Use Luhn Algorithm to validate

int sum = 0;

//int len = 0;

for (int i = len - 1; i >= 0; i--)

{

if (i % 2 == len % 2)

{

int n = cardNumber[i] * 2;

sum += (n / 10) + (n % 10);

}

else

sum += cardNumber[i];

}

bool total = Convert.ToBoolean(sum % 10 == 0);

return (total);

}

public enum CardType

{

Invalid,

Unknown,

AmericanExpress,

Bankcard,

DinersClubInternational,

DinersClubUSandCanada,

DiscoverCard,

JCB,

Maestro,

MasterCard,

SoloDebit,

SwitchDebit,

Visa,

VisaElectron,

enRoute

}

public static CardType GetCardType(string cardNumber)

{

cardNumber = cardNumber.Replace(" ", "");

// Check American Express

if (cardNumber.Substring(0, 2) == "34" ||

cardNumber.Substring(0, 2) == "37")

{

if (cardNumber.Length == 15)

return CardType.AmericanExpress;

else

return CardType.Invalid;

}

// Check Bankcard

if (cardNumber.Substring(0, 3).ToUpper() == "DNE")

return CardType.Bankcard;

// Check Diners Club Internationl

if (cardNumber.Substring(0, 2) == "36" ||

cardNumber.Substring(0, 2) == "38" ||

(Convert.ToInt32(cardNumber.Substring(0, 3)) >= 300 &&

Convert.ToInt32(cardNumber.Substring(0, 3)) <= 305))

if (cardNumber.Length == 14)

return CardType.DinersClubInternational;

else

return CardType.Invalid;

// Check Diners Club US and Canadaa

if (cardNumber.Substring(0, 2) == "55")

return CardType.DinersClubUSandCanada;

// Check Discover Card

if (cardNumber.Substring(0, 4) == "6011")

if (cardNumber.Length == 16)

return CardType.Bankcard;

else

return CardType.Invalid;

// Check JCB Card

if (cardNumber.Substring(0, 4) == "2131" ||

cardNumber.Substring(0, 4) == "1800")

if (cardNumber.Length == 15)

return CardType.JCB;

else

return CardType.Invalid;

// Check Maestro Card

if (cardNumber.Substring(0, 4) == "5020")

if (cardNumber.Length == 16)

return CardType.Maestro;

else

return CardType.Invalid;

// Check MasterCard

if ((Convert.ToInt32(cardNumber.Substring(0, 3)) >= 51 &&

Convert.ToInt32(cardNumber.Substring(0, 3)) <= 55))

if (cardNumber.Length == 16)

return CardType.MasterCard;

else

return CardType.Invalid;

// Check Solo Card

if (cardNumber.Substring(0, 2) == "63" ||

cardNumber.Substring(0, 4) == "6767")

if (cardNumber.Length == 16 || cardNumber.Length == 18 ||

cardNumber.Length == 19)

return CardType.SoloDebit;

else

return CardType.Invalid;

// Check Switch Card

if (cardNumber.Substring(0, 4) == "4903" ||

cardNumber.Substring(0, 4) == "4905" ||

cardNumber.Substring(0, 4) == "4911" ||

cardNumber.Substring(0, 4) == "4936" ||

cardNumber.Substring(0, 6) == "564182" ||

cardNumber.Substring(0, 6) == "633110" ||

cardNumber.Substring(0, 4) == "6333" ||

cardNumber.Substring(0, 4) == "6759")

if (cardNumber.Length == 16 || cardNumber.Length == 18 ||

cardNumber.Length == 19)

return CardType.SwitchDebit;

else

return CardType.Invalid;

// Check Visa Electron Card

if (cardNumber.Substring(0, 6) == "417500")

if (cardNumber.Length == 16)

return CardType.VisaElectron;

else

return CardType.Invalid;

// Check Visa Card

if (cardNumber.Substring(0, 1) == "4")

if (cardNumber.Length == 16)

return CardType.Visa;

else

return CardType.Invalid;

// Check enRoute Card

if (cardNumber.Substring(0, 4) == "2014" ||

cardNumber.Substring(0, 4) == "2149")

if (cardNumber.Length == 15)

return CardType.enRoute;

else

return CardType.Invalid;

return CardType.Unknown;

}

}

}

 

 

what errors?  what errors?

29-Sep-08 08:11 AM
is it simulation or real project?

Simulation  Simulation

29-Sep-08 08:17 AM
It's not a real project??

Solution  Solution

29-Sep-08 08:39 AM

Hi

Have a look at the bellow code...

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;
}


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);
}
}
re  re
29-Sep-08 08:40 AM
private static bool ValidateCardNumber( string cardNumber )
{
    try 
    {
        // Array to contain individual numbers
        System.Collections.ArrayList CheckNumbers = new ArrayList();
        // So, get length of card
        int CardLength = cardNumber.Length;
    
        // Double the value of alternate digits, starting with the second digit
        // from the right, i.e. back to front.
        // Loop through starting at the end
        for (int i = CardLength-2; i >= 0; i = i - 2)
        {
            // Now read the contents at each index, this
            // can then be stored as an array of integers

            // Double the number returned
            CheckNumbers.Add( Int32.Parse(cardNumber[i].ToString())*2 );
        }

        int CheckSum = 0;    // Will hold the total sum of all checksum digits
            
        // Second stage, add separate digits of all products
        for (int iCount = 0; iCount <= CheckNumbers.Count-1; iCount++)
        {
            int _count = 0;    // will hold the sum of the digits

            // determine if current number has more than one digit
            if ((int)CheckNumbers[iCount] > 9)
            {
                int _numLength = ((int)CheckNumbers[iCount]).ToString().Length;
                // add count to each digit
                for (int x = 0; x < _numLength; x++)
                {
                    _count = _count + Int32.Parse( 
                          ((int)CheckNumbers[iCount]).ToString()[x].ToString() );
                }
            }
            else
            {
                // single digit, just add it by itself
                _count = (int)CheckNumbers[iCount];   
            }
            CheckSum = CheckSum + _count;    // add sum to the total sum
        }
        // Stage 3, add the unaffected digits
        // Add all the digits that we didn't double still starting from the
        // right but this time we'll start from the rightmost number with 
        // alternating digits
        int OriginalSum = 0;
        for (int y = CardLength-1; y >= 0; y = y - 2)
        {
            OriginalSum = OriginalSum + Int32.Parse(cardNumber[y].ToString());
        }

        // Perform the final calculation, if the sum Mod 10 results in 0 then
        // it's valid, otherwise its false.
        return (((OriginalSum+CheckSum)%10)==0);
    }
    catch
    {
        return false;
    }
}
solution  solution
29-Sep-08 09:49 AM
If it is not real application then there are somany ways to validate creditcards. You need to create the data base first of all to store the credit card information in encrypted form. Use below code.

[code=csharp]public enum CCType
    {
        VISA, MC
    }

    /// <summary>
    /// Credit card validation.
    /// Supports : VISA and MasterCard
    /// Reference: http://www.merriampark.com/anatomycc.htm
    /// Contains LUHN (mod 10) check
    /// by D.S.
    /// http://aspnetcafe.com/
    /// </summary>
    public class CreditCardValidator
    {
        protected string _CardNumber = "";

        public CreditCardValidator(string aCardNumber)
        {
            _CardNumber = aCardNumber.Replace(" ","").Replace("-","");
            ProcessValidation();
        }

        protected bool _IsValid;

        public bool IsValid
        {
            get { return _IsValid; }
            set { _IsValid = value; }
        }

        private CCType _CardType;

        public CCType CardType
        {
            get { return _CardType; }
            set { _CardType = value; }
        }
       
        protected void ProcessValidation()
        {
            bool passRegEx = false;
            bool passIssuer = false;
            bool passLuhn = false;
            IsValid = false;

            do
            {
                // Reg Ex check //
                Regex RegExNumber = new Regex(@"(?<firsttwo>(?<firstone>\d)\d)\d{11,14}");
                Match m = RegExNumber.Match(_CardNumber);
                passRegEx = m.Success;
                if (!passRegEx) break;
                string number = m.Groups[0].Value; // only digits //
                string firstNum = m.Groups["firstone"].Value;
                int firstTwoNum = int.Parse(  m.Groups["firsttwo"].Value );
                passIssuer = (firstNum == "4") || ((firstTwoNum >= 51) && (firstTwoNum <= 55));
                if (!passIssuer) break;
                if (firstNum == "4") CardType = CCType.VISA;
                if ((firstTwoNum >= 51) && (firstTwoNum <= 55)) CardType = CCType.MC;
                // Now make Luhn check //
                passLuhn = LuhnCheck(number);
                if (!passLuhn) break;
                //
                IsValid = true;
            } while (false);          
        }

        /// <summary>
        /// Performs mod 10 check
        /// </summary>
        /// <param name="cardNumber">Card Number with only numbers</param>
        /// <returns></returns>
        protected bool LuhnCheck(String cardNumber)
        {
            int sum = 0;
            int digit = 0;
            int addend = 0;
            bool timesTwo = false;

            for (int i = cardNumber.Length - 1; i >= 0; i--)
            {
                digit = int.Parse(cardNumber.Substring(i, 1));
                if (timesTwo)
                {
                    addend = digit * 2;
                    if (addend > 9)
                    {
                        addend -= 9;
                    }
                }
                else
                {
                    addend = digit;
                }
                sum += addend;
                timesTwo = !timesTwo;
            }

            int modulus = sum % 10;
            return (modulus == 0);
        }
    }[/code]

refer http://aspnetcafe.com/post/Credit-Card-number-validation-in-C-Visa-and-MC-yet.aspx for details.


using regular expression  using regular expression
29-Sep-08 09:50 AM
The following function will return true if entered creditcard number is valid.
  1. //Namespace Reference
  2. using System.Text.RegulsrExpressions
  3.  
  4.  
  5. /// <summary>
  6. /// method to validate a credit card number
  7. /// </summary>
  8. /// <param name="num">cc number to validate</param>
  9. /// <returns>true/false</returns>
  10. public static bool validCCNum(string num)
  11. {
  12.     // This expression is looking for a series of numbers, which follow the pattern
  13.     // for Visa, MC, Discover and American Express. It also allows for dashes between sets of numbers
  14.     string pattern = @"^((4\d{3})|(5[1-5]\d{2})|(6011))-?\d{4}-?\d{4}-?\d{4}|3[4,7][\d\s-]{15}$";
  15.     Regex match = http://www.google.com/search?q=new+msdn.microsoft.com Regex(pattern);
  16.     return match.IsMatch(num);
  17. }
Let me know if my posts are useful.

-Paresh
tested code  tested code
29-Sep-08 09:53 AM
I have tested your code.. You will need to define the initial values like below code. This code is running fine got from http://www.eggheadcafe.com/forumpostsubmission.aspx?topicid=2&forumpostid=10056615
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);
}
}

Hi verma  Hi verma
30-Sep-08 01:32 AM

The problem is in the line 55

number[len++] = byte.Parse(cardNumber);

Common error: Value was either too large or too small for an unsigned byte.

Create New Account
help
according to product. I have created one interface Request something like this. public interface Request { bool Validate; bool WriteFile(); bool Process(); } Now every product has a request which is inherited from this interface like this class DCARequest:Request { private ArrayList Area; private ArrayLIst Counts; public bool Validate() { / / code. . . . . . . . . . } public bool WriteFile() { / / code. . . . . . . . . . } public bool Process() { / / code. . . . . . . . . . } } now another product SiteNet has class SiteNetRequest:Request { private
Optimal Code / Reading MSIL .NET Framework hi @all, I have these two getter: public ArrayList I1 { get { if (i1 = = null) { i1 = new ArrayList(); } return i1; } } public ArrayList I2 { get { i2 = i2 ?? new ArrayList(); return i2; } } It seems to me, that the MSIL output for the second getter is the shorter one. But is it also the faster one? - - .method public hidebysig specialname instance class [mscorlib]System.Collections.ArrayList get_I1() cil managed { / / Code size 41 (0x29) .maxstack 2 .locals init ([0] class [mscorlib]System.Collections.ArrayList CS$1$0000, [1] bool CS$4$0001) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldfld
how to save my class in settings .NET Framework I'm trying to use the settings class of my C# project to save an ArrayList of my class SyncSystem. I have added the ArrayList using the settings dialog with user scope. What happens is that when I save the the application then start it up again, the saved data is no longer there, the ArrayList is null. I check this by adding this to fMain: if (SFS.Properties.Settings.Default.SyncSystems = = null) { MessageBox.Show("null"); SFS.Properties.Settings.Default.SyncSystems = new System.Collections.ArrayList(); } What am I doing wrong? Is my class not serializable? An ArrayList is serializable, right? here is the save code: SyncSystem ss = new
Structure .NET Framework Hi I have a Container that is an an Array List of Class Each ArrayList element can be the class or a another ArrayList of Class So there the ArrayList could look like Element 1 - Class Element 2 - Class Element 1 - ArrayList Of Class Element 1 - Class Element 2 - Class Element 3 - Class Element
ArrayList i have written following code alprice.Add(Convert.ToInt32(gvAppetizer.Rows[i].Cells[4].Text)); where alprice is the object of ArrayList class so how can I check the value of the Arraylist object at run time thanks in advance try using foreach clause foreach(object c in can check in this manner alPrice.Contains("ur string"); Hi you can check of the Arraylist object by putting the break point at the array list and get the ArrayList aldetails = new ArrayList(); aldetails.Add(ne.Customers.Select(d = > d.CustomerID)); aldetails.Contains("Search object"); You can use contains() method to search particular object in ArrayList, if that list contains search vale then it will return true otherwise it will return