# Re: Checking Credit Cards (#122)

**URL:** <https://www.ruby-forum.com/t/re-checking-credit-cards-122/103029>\
**Category:** Ruby\
**Created:** [April 30, 2007, 11:42pm UTC](https://www.ruby-forum.com/t/re-checking-credit-cards-122/103029 "2007-04-30T23:42:58Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bartosz\_Blimke](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/ecd19e/32.png) [@Bartosz\_Blimke](https://www.ruby-forum.com/u/Bartosz_Blimke)\
**Post date:** [April 30, 2007, 11:42pm UTC](https://www.ruby-forum.com/t/re-checking-credit-cards-122/103029/1 "2007-04-30T23:42:58Z")

</div>

class CreditCardNumberValidator

```
CARD_TYPE = {
    :amex => 'AMEX',
    :discover => 'DISCOVER',
    :master_card => 'MASTER CARD',
    :visa => 'VISA',
    :unknown => 'UNKNOWN'
}

CARD_NUMBER_PATTERN = {
    :amex => /^3[4|7][0-9]{13}$/,
    :discover => /^6011[0-9]{12}$/,
    :master_card => /^5[1-5][0-9]{14}$/,
    :visa => /^4[0-9]{12}$|^4[0-9]{15}$/
}

def self.card_type(card_num)
    CARD_NUMBER_PATTERN.each do |t, p|
        return CARD_TYPE[t] if card_num =~ p
    end
    CARD_TYPE[:unknown]
end

def self.valid?(card_num)
    sum = 0
    card_num.to_s.reverse.scan(/./).each_with_index do |digit, 

```

index|  
digit = digit.to\_i \* (1 + (index % 2))  
sum+=digit/10 + digit%10;  
end  
sum % 10 == 0  
end  
end

abort “Usage: #{$0} number” unless ARGV.length \> 0  
card\_num = ARGV.join.to\_i  
puts “Number: #{card\_num}”  
puts 'Type: ’ + CreditCardNumberValidator.card\_type(card\_num)  
puts 'Validation: ’ + (CreditCardNumberValidator.valid  
?(card\_num)?‘Valid’:‘Invalid’)
