I've been trying to implement the Luhn algorithm in Ruby. I've been following these steps:
- The formula verifies a number against its included check digit, which is usually appended to a partial account number to generate the full account number. This account number must pass the following test:
- Counting from the check digit, which is the rightmost, and moving left, double the value of every second digit.
- Sum the digits of the products (e.g., 10 = 1 + 0 = 1, 14 = 1 + 4 = 5) together with the undoubled digits from the original number.
- If the total modulo 10 is equal to 0 (if the total ends in zero) then the number is valid according to the Luhn formula; else it is not valid.
http://en.wikipedia.org/wiki/Luhn_algorithm
This is what I've came up with:
def validCreditCard(cardNumber)
sum = 0
nums = cardNumber.to_s.split("")
nums.insert(nums.size, "x")
nums.reverse!
nums.each_with_index do |n, i|
if !n.eql?("x")
sum += (i % 2 == 0) ? n.to_i : n.to_i * 2
end
end
if (sum % 10) == 0
return true
else
return false
end
end
However, this returns false every time I test it. I am not sure what I am doing wrong.
ifstatement at the end of your method is extraordinarily and unnecessarily verbose. If the logic is correct, you can simply replace that all with justsum%10 == 0; this evaluates to eithertrueorfalse, and the value of the final expression in a method is the return value of the method.