Luhn算法Ruby无法识别AMEX

Posted

技术标签:

【中文标题】Luhn算法Ruby无法识别AMEX【英文标题】:Luhn algorithm Ruby not recognising AMEX 【发布时间】:2015-03-11 23:25:18 【问题描述】:

所以我在应用 Luhn 算法时遇到了一些问题 以下是一般规则:http://www.codeproject.com/Tips/515367/Validate-credit-card-number-with-Mod-algorithm

这是我的代码

def luhn(credit_card)
  result = 0
    nums = credit_card.split("")
    nums.each_with_index do |item, index|
      if index.even?
        if item.to_i*2>9
            result+= item.to_i*2-9
        else 
            result+= item.to_i*2
        end
      else
        result +=item.to_i
        end
    end
    if (result % 10) == 0
      self.validation = "valid"
    else
      self.validation = "invalid"
    end
end

它适用于大多数卡片

VISA: 4111111111111111       (valid)
VISA: 4111111111111          (invalid)
VISA: 4012888888881881       (valid)
Discover: 6011111111111117   (valid)
MasterCard: 5105105105105100 (valid)
MasterCard: 5105105105105106 (invalid)
Unknown: 9111111111111111    (invalid)

但是说到这个

美国运通:37828224631000(无效)

由于某种原因我的代码说它无效,但它应该根据官方测试卡列表。

我看到了一堆其他的代码,但我想纠正错误并理解我的错误。我会很感激一些解释为什么它会这样工作。

【问题讨论】:

if index.even? 是错误的。阅读算法。 【参考方案1】:

您确定您的美国运通号码应该是有效的吗?

您能否编辑您的问题,向我们展示您从哪里获得测试编号?

这是我在其他 Lunh 测试套件中看到的:

“378282246310005”应该是真的 “37828224631000”应该是假的

另外,这里有一些项目供您查看:

您的代码以错误的方式在数字中移动:您是从左向右移动,而 Lunh 是从右向左移动。

您的代码在校验位上迭代,而 Lunh 不在校验位上迭代。

在循环之前尝试剥去校验位,并反转您的顺序,例如:

def luhn(credit_card)
  (*digits, checksum_digit) = s.split('').map(&:to_i)
  result = 0
  digits.reverse.each_with_index do |item, index|
    …

算完总和后,加上校验和数字,然后比较%10。

【讨论】:

谢谢@joelparkerhenderson,所以它适用于我列出的所有其他卡只是巧合吗? :( 不客气。我不认为这是巧合,因为这不太可能。我认为这是因为当位数为偶数时,您的代码和正确的算法工作相同。

以上是关于Luhn算法Ruby无法识别AMEX的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 1.9.1 在 Ubuntu 上无法识别

[ruby.exe尝试登录并使用heroku时无法识别

人脸识别不成功怎么回事?

无法识别 ubuntu 终端中的导轨,但在 aptana 终端中

coco图像识别无法使用

java无法识别怎么办