ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > 函数与公式 > 如何判断银行卡末位校验码正误?

如何判断银行卡末位校验码正误?

作者:绿色风 分类: 时间:2022-08-17 浏览:345
楼主
gouweicao78
Q:银行卡卡号,目前一般为16位或19位,最后一位是校验码,计算规则如下:
以16位卡号为例:
1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
2,将编号奇位乘积的个、十位全部相加(比如某号是6,则乘2后得12,个、十位相加为3),再加上所有编号偶数位上的数字。
3,将加法和加上校验位能被 10 整除。

示例:
6   2   2    5   8    8   1    4   1    4    2    0   7   4    3    0
2        2         2         2         2          2         2         2
→→→→→→→→→→→→→→→→→→→→→→
12  2   4   5  16   8    2    4   2   4     4   0   14   4   6
将上面的红色数字加和:1+2+2+4+5+1+6+8+2+4+2+4+4+1+4+4+6 = 60

因为60+0能被10整除,所以校验码是0。



 


A:如图,在C2单元格输入以下数组公式可以计算银行卡校验码:

  1. =MOD(SUM(-MID(TEXT((0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2)+1,2),1))*2,"00"),{1,2},1),-(0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2),2),1))),10)
或者
  1. =MOD(SUM(-MID(TEXT(MMULT((0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2)+{0,1},2),1))*{1,2},{100;1}),"000"),{1,2,3},1)),10)
下面这个解法错误

  1. =MOD(-SUM(MOD((0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2)+{0,1},2),1))*{1,2},{10,9})),10)

如何判断银行卡号校验码正误.rar
2楼
gouweicao78
  1. =MOD(SUM(-MID(TEXT((0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2)+1,2),1))*2,"00"),{1,2},1),-(0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2),2),1))),10)
1、由于卡号有16位、19位两种,而编号是从右往左进行,编号的奇数、偶数与卡号长度有关。
ROW($1:$9)*2-MOD(LEN(A2)+1,2)——即从左往右的第2、4、……18位减去1或0
其中,使用MOD(LEN(A2)+1,2),16位卡号得到1、19位卡号得到0,作为修正,取得编号奇数位的值:
当卡号是16位时,也就是取从左往右的1、3、5、……15、17位;
当卡号是19位时,也就是取从左往右的2、4、5、……16、18位;

2、使用0&MID,防止卡号只有16位时,17、18位是空文本导致计算#VALUE!错误。

3、使用TEXT((0&mid)*2,"00"),将奇数位的号码乘2之后变为2位数;

4、使用-MID(TEXT,{1,2},1)取出这些2位数的个、十位;

5、同理,使用-MID与mod修正,取出偶数位的号码

6、使用SUM求得两个-MID的结果,得到一个负数;

7、使用MOD(负数,10)求以10为模的“补数”,也就是校验码。关于“补数”参阅:如何求1个数每位数字的补数并重新组合成新数?
http://www.exceltip.net/thread-12524-1-1.html
3楼
gouweicao78
注意:本解法错误,未考虑9*2=18时1+8的和值为9的情况,请跳过:


公式2解读
  1. =MOD(-SUM(MOD((0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2)+{0,1},2),1))*{1,2},{10,9})),10)
本次多次使用常量数组进行计算,实际上就是将奇数、偶数位的号码一次搞定。
通过对规则的理解,归纳出:
奇数位要*2并求个、十位之和;偶数位直接求和。

个、十位之和如何求,这里运用了一个小技巧——对9求余。比如12的个、十位之和是3,正好是对9求余的结果,1234各个数位之和是10,而10的个、十位之和是1,用1234对9求余也是1。
参阅:如何将一串数字逐位累加到 1 位数?
http://www.exceltip.net/thread-1181-1-1.html


因此,本公式变成:

1、0&MID(LEFT去掉校验位,row-mod修正得到{偶数位、奇数位},1)*{1,2}——即偶数位保持不变、奇数位*2

2、MOD({偶数位,奇数位*2},{10,9})——偶数位是个位数,对10求余保持不变,奇数位对9求余(因为奇数位是*2的,结果肯定是偶数,不会出现9导致余数为0的情况),得到奇数位个、十位之和。

3、MOD(-SUM,10)求“补数”。
4楼
wqfzqgk
不错,学习下,有些还没有研究透,做了个自定义函数:是不是符合要求

  1. Function testt(rng As Range)
  2. For i = 1 To Len(rng) - 1
  3. If i Mod 2 = 1 Then
  4. If Mid(rng, i, 1) >= 5 Then
  5. a = CInt(Mid(Mid(rng, i, 1) * 2, 1, 1)) + CInt(Mid(Mid(rng, i, 1) * 2, 2, 1)) + a
  6. Else
  7. c = CInt(Mid(rng, i, 1) * 2) + c
  8. End If
  9. End If
  10. If i Mod 2 = 0 Then b = b + CInt(Mid(rng, i, 1))
  11. Next
  12. If CInt(Right(rng, 1)) = (10 - (a + b + c) Mod 10) Then
  13. testt = "校验码正确"
  14. Else
  15. testt = "校验码错误"
  16. End If
  17. End Function
啥时候能学到草版这样的函数头脑啊
5楼
gvntw
呵呵,我其中一张卡,代入公式后,C列公式正确,D和E列却显示错误,草兄再看看吧。

 
6楼
gouweicao78
确实有错误,谢谢发哥指正。
代码*2可能是9*2=18,和值应该为9而不是0。

改用:
  1. =MOD(SUM(-MID(TEXT(MMULT((0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2)+{0,1},2),1))*{1,2},{100;1}),"000"),{1,2,3},1)),10)


公式3解读:
1、使用0&MID(LEFT去掉校验位,row-mod修正得到{偶数位、奇数位},1)*{1,2}——即偶数位保持不变、奇数位*2

2、使用MMULT(MOD({偶数位,奇数位*2},{100;1}),得到偶数位*100+奇数位*2,比如偶数位是1,奇数位是9,得到118

3、使用-MID(MMULT,{1,2,3})取出各个数字,SUM求和,然后MOD(-SUM,10)求“补数”。
7楼
wjc2090742
原来也没有发现9*2=18的问题,发哥回帖了才发现。但是,如果只是针对20之内的各位加至1位,感觉放弃MOD(...,9)太可惜了,不知道下面这样可以吗?加至1位的话,的确是除以9的余数或减去9倍数的差,我觉得这是个非常棒的规律或算法,值得继续深入下去。
  1. =INT(MOD(RIGHT(A2)-SUM(MOD((0&MID(REPT(0,LEN(A2))&A2,ROW($1:$19)*2-{1,0},1))*{2,1},{9.1,10})),10))


公式二改的,目前测试都通过
  1. =INT(MOD(-SUM(MOD((0&MID(LEFT(A2,LEN(A2)-1),ROW($1:$9)*2-MOD(LEN(A2)+{0,1},2),1))*{1,2},{10,9.1})),10))
8楼
birdflyinsky
楼主的判断校码那项好像不对,校验码算出来是对的,不过显示校验码错误。能否说一下,判断原理 ?
9楼
空气
10楼
gouweicao78
只有MOD对9求余的错误,经gvntw版主提出后,我也回复了新的解法,其他解法是正确的。所有的原理都写出来了。不知道你指的“好像不对”是哪里,哪里的原理还需要说明。
11楼
亡者天下
太复杂了,没有看懂!
12楼
mikechan22
有个问题,我拿excel试了下,ROW($1:$9)总是=1,不会是像作者说的,是1-9。
13楼
gouweicao78


ROW($1:$9)返回第1-9行的行号,也就是数字1-9
你之所以看到1是因为你只用1个单元格来显示,显示的是数组左上角第一个元素。

选A1:A9,输入=ROW($1:$9),按CTRL+SHIFT+ENTER结束,就可以看到返回结果。
14楼
373153461
=MOD(SUM(-MID(TEXT(MMULT((0&MID(LEFT(A1,LEN(A1)-1),ROW($1:$9)*2-MOD(LEN(A1)+{0,1},2),1))*{1,2},{100;1}),"000"),{1,2,3},1)),10)=RIGHT($A1)
请问各位高手,上述验证公式如何在单元格中用数据有效性来表示!!!
15楼
gouweicao78


公式中用的是A1,就在A1单元格设置数据有效性→自定义→贴入公式有效性.jpg
 
16楼
373153461
不是不知道操作,是因为这个公式不能贴入!
提示:在数据有效性条件中不能使用联合、交叉引用或数组常量。
17楼
gouweicao78
先定义名称X,然后在数据有效性的公式中输入=X。
18楼
kszcs
都是高手,只有看的份
19楼
Rongson_Chart
路过学习~~
20楼
猴子
有意思、、、好玩

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap