Credit Card Validation in C#

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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; number[1] != 6 &amp;&amp; number[1] != 8)
               || number[1] == 0 &amp;&amp; number[2] > 5)
               return false;
            break;

         case CardType.JCB:
            if(len != 16 &amp;&amp; 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);
   }
}
You can leave a response, or trackback from your own site.

3 Responses to “Credit Card Validation in C#”

  1. Nitin Sawant says:

    can you provide C# code to generate valide credit cards??

    regards,
    Nitin Sawant

  2. mexicotom says:

    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).

  3. Howzilla says:

    Thanks for the code. You really saved me some time with this.

Leave a Reply

Subscribe to RSS Feed Follow me on Twitter!