Luhn算法Ruby不识别AMEX

时间:2015-01-13 21:22:20

标签: ruby-on-rails ruby credit-card luhn

所以我在应用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)

但是当涉及到这个

AMEX:37828224631000(无效)

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

我已经看到其他一些代码正在运行,但我想纠正错误并理解我的错误。我会理解为什么它会像这样工作。

1 个答案:

答案 0 :(得分:2)

您确定您的美国运通卡号码有效吗?

您可以编辑问题以向我们展示您获取测试号码的位置吗?

这是我在其他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。