所以我在应用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(无效)
出于某种原因,我的代码说它是无效的,但它应该根据官方的测试卡列表。
我已经看到了很多其他的代码在工作,但我想纠正错误,理解我的错误。我会感谢你解释为什么它会这样工作。

最佳答案

你确定你的美国运通号码应该有效吗?
你能编辑你的问题,告诉我们你在哪里得到你的测试号码吗?
以下是我在其他Lunh测试套件中看到的情况:
“37828224631005”应为真
“37828224631000”应为false
另外,这里还有一些项目供您查看:
你的代码以错误的方式在数字中移动:你从左向右移动,而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。

09-27 01:16