require "luhn/version" class Numeric def luhn digits = self.to_s.chars.map(&:to_i) sum = digits.reverse.each_with_index.map{ |x, i| i.even? ? (x * 2).divmod(10).inject(:+) : x }.reverse.inject(:+) (10 - sum % 10) end def luhn? self.div(10).luhn == (self % 10) end def luhn! self * 10 + luhn end end class String def luhn self.gsub(/\D+/, '').to_i.luhn.to_s end def luhn? self.gsub(/\D+/, '').to_i.luhn? end def luhn! self + luhn end end