楼主 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单元格输入以下数组公式可以计算银行卡校验码:
如何判断银行卡号校验码正误.rar |
2楼 gouweicao78 |
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解读
通过对规则的理解,归纳出: 奇数位要*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 |
不错,学习下,有些还没有研究透,做了个自定义函数:是不是符合要求
|
5楼 gvntw |
呵呵,我其中一张卡,代入公式后,C列公式正确,D和E列却显示错误,草兄再看看吧。 |
6楼 gouweicao78 |
确实有错误,谢谢发哥指正。 代码*2可能是9*2=18,和值应该为9而不是0。 改用:
公式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倍数的差,我觉得这是个非常棒的规律或算法,值得继续深入下去。
公式二改的,目前测试都通过
|
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楼 猴子 |
有意思、、、好玩 |