Sha256: 27e75380f7b84bbe162de31cf8043247b430dd33015c45424760bfe21200328d

Contents?: true

Size: 990 Bytes

Versions: 1

Compression:

Stored size: 990 Bytes

Contents

module CreditCardNumberValidator
  def valid_credit_card?(number)
    return false unless valid_association?(number)

    reversed_ccnum = number.reverse
    relative_number = {'0' => 0, '1' => 2, '2' => 4, '3' => 6, '4' => 8, '5' => 1, '6' => 3, '7' => 5, '8' => 7, '9' => 9}
    sum = 0

    reversed_ccnum.split("").each_with_index do |n, i|
      sum += (i % 2 == 0) ? n.to_i : relative_number[n]
    end

    sum % 10 == 0
  end

  def valid_association?(number)
    ccnum = number.to_s.gsub(/\D/, "")

    return :diners  if ccnum.length == 14 && ccnum =~ /^3(0[0-5]|[68])/   # 300xxx-305xxx, 36xxxx, 38xxxx
    return :amex     if ccnum.length == 15 && ccnum =~ /^3[47]/            # 34xxxx, 37xxxx
    return :visa     if [13,16].include?(ccnum.length) && ccnum =~ /^4/    # 4xxxxx
    return :master   if ccnum.length == 16 && ccnum =~ /^5[1-5]/           # 51xxxx-55xxxx
    return :discover if ccnum.length == 16 && ccnum =~ /^6011/             # 6011xx
    return nil
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
faker_credit_card-0.0.2 test/credit_card_number_validator.rb