技巧區‎ > ‎高級程度‎ > ‎

核對信用卡號碼 [2001年10月]

張貼者:2010年5月29日 上午6:31Carson Cheng   [ 已更新 2010年5月29日 上午6:32 ]
這裡介紹兩個關於信用卡號碼的函數,兩個函數一併使用,就可以決定一個信用卡號碼是否正確。當然,這個範例對初學巨集的人也是一個很好的練習。 

Luhn算式
首先介紹一個叫Luhn的算式,它可以決定一系列的數字是否正確。
  算法很蠻簡單,從右到左,把單數數位(如個位、百位等)的數值則可以直接累計起來;雙數數數位(如十位、千位)的數值則乘2,如大於9則減9,然後把得出的數字累計起來;。最後累計得來的數值如果是10的倍數,信用卡號碼則為正確。
  用6528做個例子:

  由於累計數20是10的倍數,也就是說可以給10除盡,故此6528這個數字是符合Luhn算式的。



語法:
' 信用卡號碼是否正確
Function IsValidCreditCardNo(sCreditCard As String) As Boolean
   Dim iCardNoLen As Integer  ' 信用卡號碼長度
   Dim iSum As Integer             ' 累計用
   Dim i As Integer
   Dim iTemp As Integer
   
   ' 起始化
   iCardNoLen = Len(sCreditCard) ' 信用卡號碼長度
   iSum = 0                                      ' 用作累計的變數
   
   ' 單數(由右至左)的數位直接加到累計
   For i = iCardNoLen To 1 Step -2
       iSum = iSum + Mid(sCreditCard, i, 1)
   Next i
   
   ' 雙數(由右至左)的數位乘2後,如大於9則減9,然後加到累計
   For i = iCardNoLen - 1 To 1 Step -2
       iTemp = Mid(sCreditCard, i, 1) * 2
       iSum = iSum + iTemp - IIf(iTemp > 9, 9, 0)
   Next i
   
   ' 如果累計數是10的倍數,則輸入的卡號則為正確
   IsValidCreditCardNo = (iSum Mod 10 = 0)    
End Function


  當然,我們知道這四個數字不可能是個信用卡號碼,故此我們需要另外一個函數。

信用卡的種類
下表列出較流行信用卡的種類,以及開首號碼與號碼長度。


  這個函數要寫得簡單,必須知道 Like 的用法,以下是偵測JCB的寫法:

' JCB
If (sCreditCard Like "3*" And iCardNoLen = 16) Or _
  ((sCreditCard Like "2131*" Or sCreditCard Like "1800*") And _
     iCardNoLen = 15) Then
 CreditCardType = "JCB"
End If

注意地方:

  • 在計算Luhn函數時,人一般會一個數字一個數字順序計算,但寫程序時,首先整批處理單位數字,然後才整批處理雙位數字,這樣會較簡潔。
  • 在Luhn函數裡,不要這樣寫:
      If iSum Mod 10 = 0 Then
         IsValidCreditCardNo = True
     Else
         IsValidCreditCardNo = False
     End If

      這樣寫又簡單,又清楚:
      IsValidCreditCardNo = (iSum Mod 10 = 0)
  • 編寫帶有「和 AND」和「或 OR」的條件時,請看清楚括號是否正確,記著:AND的處理優先權比OR高。
  • 不要以為輸入一個正確的信用卡號碼就可以在網上騙財!第一,受款公司可能直接連到信用卡公司,不存在的號碼原形畢露;第二,受款公司一定會記錄你付款的時間與當時候你的IP地址,要追查並不困難。

ċ
3_4.zip
(14k)
Carson Cheng,
2010年5月29日 上午6:32
Comments