0

クレジットカード番号がLuhnアルゴリズムに準拠しているかどうかを確認するために、私のコードに少し問題があります。コードは、クレジット カードが 10 で割り切れる場合に true を返しますが、CC 番号が 10 で割り切れない場合にも true を返します。数値が実際に sum 変数に加算されていることを確認するために、最終的な合計を出力しました。以下は私のコードです。よりクリーンになることはわかっていますが、この段階では、最初に機能することを確認したいと思います。

def check_card

   c_num= []

   sum=0

   s_numbers=@card_numbers.to_s.reverse.split("")

   s_numbers.each_slice(2) do |x| 
   c_num << (x.last.to_s.to_i*2)
   c_num << (x.first.to_s.to_i)
     end

  c_num.each do |num|
    if num.to_i > 9
      sum+= (num.to_i % 10)+1
    else 
      sum += num.to_i
    end
  end

sum % 10==0 

end

これがどのように呼び出されているかです:

it 'returns false for a bad card' do
  card = CreditCard.new(4408041234567892)
  card.check_card.should eq false
end
4

4 に答える 4

0

これはあなたのコードで、コメントが付けられ、ウィキペディアの説明のように動作するように調整されています。

def check_card(str) #creditcardnumber as argument

   c_num = []

   sum = 0

   s_numbers = str.split("") #no reversing. str.split("").map(&:to_i) would save a lot of to_i's later on...
   checksum = s_numbers.pop.to_i #chop off last digit, store as checksum

   s_numbers.each_slice(2) do |x| 
     c_num << (x.last.to_s.to_i*2)
     c_num << (x.first.to_s.to_i)
   end

  c_num.each do |num|
    if num.to_i > 9
      sum+= (num.to_i % 10)+1
    else 
      sum += num.to_i
    end
  end

  (sum * 9) % 10 == checksum 

end

p check_card("79927398713") #=> true
于 2013-09-25T20:25:21.447 に答える