Excel 公式测试 15 或 16 位数字是否为有效信用卡并返回真/假(Luhn 算法)

Excel 公式测试 15 或 16 位数字是否为有效信用卡并返回真/假(Luhn 算法)

我发现下面有一个非常清晰的电子表格,可以测试任意长度的数字是否通过 Luhn 算法。但是,我想要一个“超级公式”,将整个计算放在一个单元格中,并沿着一列向下进行。A信用卡号也是如此,B只需计算真或假。

测试用例示例:

  • 343280696646912 --> 正确
  • 343280696646913 --> 错误
  • 5106594187457183 --> 正确
  • 5106594187457184 --> 错误

电子表格中的公式如下: Luhn 算法的图片分布在许多单元格中

计算分布的 Excel 表示例:https://web.archive.org/web/20080906205913/http://www.beachnet.com/~hstiles/bin/luhn.zip

答案1

这是一个计算结果的公式,在最新版本的 Excel 中它无需任何特殊操作即可运行,在早期版本中您需要将其作为数组公式输入(输入后按 CTRL+SHIFT+ENTER)。

在此处输入图片描述

C2 中的公式:
=SUM(INT(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)*(MOD(ROW($1:$20),2)+1)/10)+MOD(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)*(MOD(ROW($1:$20),2)+1),10))

D2 中的公式(最终结果):
=MOD(SUM(INT(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)*(MOD(ROW($1:$20),2)+1)/10)+MOD(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)*(MOD(ROW($1:$20),2)+1),10)),10)=0

怎么运行的:

  • REPT("0",20-LEN(B2))&B2生成长度为 20 且以 0 开头的数字
  • ROW($1:$20)生成 1 到 20 的数字列表(该部分不应更改!)
  • MOD(ROW($1:$20),2)+1生成交替数字 1 和 2
  • IF(D6<10,D6,INT(D6/10)+MOD(D6,10))从原始公式来看:对于数字 x:0-9,x = int(x/10) + mod(x,10) 始终为真,因此可以排除此测试

答案2

只是为了为上面列出的 G Sheet 用户的 luhn 检查增加一些额外的清晰度

C 列公式 =ARRAY_CONSTRAIN(ARRAYFORMULA(SUM(INT(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)(MOD(ROW($1:$20),2)+1)/10)+MOD(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)(MOD(行($1:$20),2)+1),10))), 1, 1)

D 列公式 =ARRAY_CONSTRAIN(ARRAYFORMULA(IF((MOD(SUM(INT(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)(MOD(ROW($1:$20),2)+1)/10)+MOD(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)(MOD(ROW($1:$20),2)+1),10)),10)=0), "有效", "无效")),1, 1)

相关内容