Лунный алгоритм Ruby не распознает AMEX

Поэтому у меня возникают некоторые проблемы при применении алгоритма Луна. Вот общие правила: 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 ответ

Вы уверены, что ваш номер Amex должен быть действительным?

Можете ли вы отредактировать свой вопрос, чтобы показать нам, где вы получаете свои тестовые номера?

Вот что я вижу в других тестах 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.

Другие вопросы по тегам