Лунный алгоритм 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.