-2

I am using a Luhn lib from Github. Luhn class has more methods but I am intersted in only "generate" and "valid?" methods.

  m = Luhn.generate(9) # generates a random number like [123456789] or [098765432]
  Luhn.valid?(m)   # returns true or false based on Luhn checksum passing

But I don't want the generated number starts with "0".

so how do I put in my ruby script:

  1. Discard the generated number that starts with "0".
  2. Generate another number and check again until m[0] is non-zero.
  3. run valid?() on generated number: if false, generate another non-zero number until true.
  4. return the valid 9 digits number to the caller code
Holger Just
  • 52,918
  • 14
  • 115
  • 123
gigaimage
  • 29
  • 5

1 Answers1

1

Will this work for you? (Very basic recursion)

require 'luhn'
def generate_non_zero_luhn(size=9)
  m = Luhn.generate(size)
  m[0] != "0" && Luhn.valid?(m) ? m : generate_non_zero_luhn(size)
end

Example Outputs

10.times.map { generate_non_zero_luhn }
#=> ["582428355", "353646136", "821379013", "818135220", "696652767", 
     "934766437", "885229401", "226319044", "682121645", "688197078"]

Although I think the validity check is not needed because Luhn is generating the number so it will always be valid. e.g.

1_000_000.times.map { Luhn.valid?(Luhn.generate(9))}.any?{|val| !val}
#=> false

So then the method can become

def generate_non_zero_luhn(size=9)
  m = Luhn.generate(size)
  m[0] != "0" ? m : generate_non_zero_luhn(size)
end
engineersmnky
  • 25,495
  • 2
  • 36
  • 52
  • the `map` was to point out that it works not sure why you could not get it to work. Otherwise you just call the method eg. `generate_non_zero_luhn` this will always return a single luhn number not preceded by a zero. – engineersmnky Mar 04 '15 at 21:42