注册 登录
编程论坛 VFP论坛

银行卡号是否正确的校验方法之一(根据最后一位是否符合Luhn算法)

nbwww 发布于 2023-03-06 21:48, 901 次点击
写得不太规范,高手请绕行
程序代码:
CLEAR
no1='6222888800010008'   &&卡号
len2=INT(LEN(no1)/2)
IF LEN(no1)#16
   =MESSAGEBOX('卡号长度错误')
ENDIF   
endwei=0
FOR ii=1 TO len2  &&偶数*2  结果大于10   -9或者十位数+个位数
   js=ALLTRIM(STR(VAL(LEFT(RIGHT(no1,ii*2),1))*2))
   IF VAL(js)>=10
      endwei=endwei+VAL(LEFT(js,1))+VAL(RIGHT(js,1))
   ELSE   
      endwei=endwei+VAL(js)
   ENDIF   
ENDFOR
FOR ii=1 TO len2   &&奇数位直接相加
   js=LEFT(right(no1,ii*2-1),1)         
      endwei=endwei+VAL(js)
ENDFOR
   ?endwei
IF MOD(endwei,10)=0    &&除10 整数  校验通过
  ?no1+'  **校验正确'
ELSE
  ?no1+'  **校验错误******'
ENDIF
2 回复
#2
sdta2023-03-06 23:57
******************************************************************************
* LUHN规则说明:
* 如何判断一个银行卡号是否是真实有效的,还是胡乱编造的呢。
* 银联卡号Luhn校验规则:16位银行卡号(19位通用)
* 1.将未带校验位的 15(或18)位卡号从右依次编号 1 到 15(18),位于奇数位号上的数字乘以 2
* 2.将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
* 3.将加法和加上校验位能被 10 整除
******************************************************************************
程序代码:
CLEAR
lckh = "6222888800010008"
IF NOT BETWEEN(LEN(lckh), 16, 19)
    MESSAGEBOX("银行卡号长度必须为16-19位")
    RETURN
ENDIF
* 其它容错就不写了
* [color=#800000]16-19位银行卡号检验[/color]
STORE 0 TO ln1, ln2
FOR ln = LEN(lckh) - 1 TO 1 STEP - 1
    lc = SUBSTR(lckh, ln, 1)
    ln3 = LEN(lckh) - ln
    IF MOD(ln3, 2) = 1
        ln1 = ln1 + INT((VAL(lc)*2)/10) + MOD((VAL(lc)*2),10)
    ELSE
        ln2 = ln2 + VAL(lc)
    ENDIF
ENDFOR
lnSum = ln1 + ln2 + VAL(RIGHT(lckh, 1))
IF MOD(lnSum, 10) = 0
    MESSAGEBOX("====银行卡号校验正确====")
ELSE
    MESSAGEBOX("****银行卡号校验不正确****")
ENDIF
#3
hu9jj2023-03-07 11:26
回复 楼主 nbwww
高手绕行了您如何得到提高?
1