# Recipe 14.30. Verifying a Credit Card Number

#### Problem

You are writing an application that includes credit card processing and verification functionality. While the third-party credit card host will let you know when you have passed an invalid card number, you would like to catch invalid card numbers immediately when users enter them.

#### Solution

Sample code folder: Chapter 14\LuhnAlgorithm

Use the Luhn Algorithm to determine if a credit card number is valid or not. The Luhn Algorithm (or Luhn Formula) was invented by Hans Peter Luhn of IBM in the 1960s as a method of verifying account numbers of varying lengths. It is also called a "modulus 10" formula because it uses the modulus 10 formula (x Mod 10 in Visual Basic) to confirm the number.

#### Discussion

Create a new Windows Forms application, and add the following controls to Form1:

• A TextBox control named CreditCard.

• A Button control named ActVerify. Set its Text property to Verify.

Now add the following source code to the form's code template:

` Private Sub ActVerify_Click(ByVal sender As System.Object, _       ByVal e As System.EventArgs) Handles ActVerify.Click    ' ----- Check for a valid credit card number.    Dim useCard As String = ""    Dim oneDigit As String    Dim counter As Integer    ' ----- Create a string with just the digits of the card,    '       just in case the user entered spaces or dashes    '       between digit blocks.    For counter = 1 To Len(CreditCard.Text)       oneDigit = Mid(CreditCard.Text, counter, 1)       If (IsNumeric(oneDigit) = True) Then _          useCard &= oneDigit    Next counter    If (useCard.Length = 0) Then       MsgBox("Invalid card number.")    ElseIf (VerifyCreditCard(useCard) = False) Then       MsgBox("Invalid card number.")    Else       MsgBox("Card verified.")    End If End Sub Private Function VerifyCreditCard(ByVal cardNumber _       As String) As Boolean    ' ----- Given a card number, make sure it is valid.    '       This method uses the Luhn algorithm to verify    '       the number. This routine assumes that cardNumber    '       contains only digits.    Dim counter As Integer    Dim digitTotal As Integer    Dim holdValue As Integer    Dim checkDigit As Integer    Dim calcDigit As Integer    Dim useCard As String    ' ----- Perform some initial checks.    useCard = Trim(cardNumber)    If (IsNumeric(useCard) = False) Then Return False    ' ----- Separate out the last digit, the check digit.    '       For cards with an odd number of digits,    '       prepend with a zero.    If ((Len(useCard) Mod 2) <> 0) Then _       useCard = "0" & useCard    checkDigit = useCard.Substring(Len(useCard) - 1, 1)    useCard = useCard.Substring(0, Len(useCard) - 1)    ' ----- Process each digit.    digitTotal = 0    For counter = 1 To Len(useCard)       If ((counter Mod 2) = 1) Then          ' ----- This is an odd digit position.          '       Double the number.          holdValue = CInt(Mid(useCard, counter, 1)) * 2          If (holdValue > 9) Then             ' ----- Process digits (16 becomes 1+6).             digitTotal += (holdValue \ 10) + _                (holdValue - 10)          Else             digitTotal += holdValue          End If       Else          ' ----- This is an even digit position.          '       Simply add it.          digitTotal += CInt(Mid(useCard, counter, 1))       End If    Next counter    ' ----- Calculate the 10's complement of both values.    calcDigit = 10 - (digitTotal Mod 10)    If (calcDigit = 10) Then calcDigit = 0    If (checkDigit = calcDigit) Then Return True Else _       Return False End Function `

Run the program, enter a credit card number, and click the Verify button to see if the card number is valid. Visual Basic 2005 Cookbook: Solutions for VB 2005 Programmers (Cookbooks (OReilly))
ISBN: 0596101775
EAN: 2147483647
Year: 2006
Pages: 400

Similar book on Amazon