While playing a little with Ruby, I've been looking for a function each_digit, or something similar, and I couldn't find any (standard nor library). I think it'd be useful to have a function like that. It's pretty simple to implement one for Integers class Integer def each_digit(base = 10, &block) return if zero? (self/base).each_digit(base, &block) yield self % base end end A first approach. Of course, it would be a little more complicated for negatives and Floats, specially dealing with precision. What do you think?

on 2007-01-28 00:35

on 2007-01-28 00:58

On 1/28/07, CHubas <CHubas7@gmail.com> wrote: > yield self % base > end > end > > A first approach. Of course, it would be a little more complicated for > negatives and Floats, specially dealing with precision. > > What do you think? class Integer def each_digit(base=10) to_s( base ).each_byte{ |b| yield b.chr } end #def each_digit(base=10) end Cheers Robert

on 2007-01-28 01:03

On Jan 28, 2007, at 12:35 AM, CHubas wrote: > end > end > > A first approach. Of course, it would be a little more complicated for > negatives and Floats, specially dealing with precision. Good. I'd expect each_digit to return strings though, since a digit is a symbol, not a number: class Integer def each_digit(base=10) abs.to_s(base).each_byte do |b| yield b.chr end end end -- fxn

on 2007-01-28 01:15

Why call them digits, if you can call them characters? If you have got arbitrary_number, you got arbitrary_number.to_s so: ---- irb(main):001:0> arbitrary_number=123 => 123 irb(main):002:0> arbitrary_number.to_s => "123" irb(main):002:0> arbitrary_number.to_s.length => 3 irb(main):003:0> (0...arbitrary_number.to_s.length).map{|digit| arbitrary_number.to_s.split('')[digit]} => ["1","2","3"] ---- This above will do for base 10, and printf stuff may help with hex, oct at least. Remember it is '...' and not '..' so you don't access arbitrary_number[arbitrary_number.length] Hope this may help you

on 2007-01-28 01:49

On 1/28/07, Xavier Noria <fxn@hashref.com> wrote: > > return if zero? > > class Integer > def each_digit(base=10, want_sign=false) yield '-' if want_sign && self < 0 # to continue debugging my code;) abs.to_s(base).each_byte do |b|

on 2007-01-28 14:25

On Jan 28, 12:10 am, "Fer#" <fernando.mdelacu...@gmail.com> wrote: > Why call them digits, if you can call them characters? > > If you have got arbitrary_number, you got arbitrary_number.to_s so: [... snip] > This above will do for base 10, and printf stuff may help with hex, > oct at least. Actually, Fixnum#to_s and Bignum#to_s takes optional arguments specifying base, so to handle hex you'd do arbitrary_number.to_s(16) etc. Vidar

on 2007-01-29 02:13

From: Fer# [mailto:fernando.mdelacueva@gmail.com] : # irb(main):003:0> (0...arbitrary_number.to_s.length).map{|digit| # arbitrary_number.to_s.split('')[digit]} # => ["1","2","3"] forgive my ignorance, but why are you splitting them and rebuilding back the array. I mean why not, # arbitrary_number.to_s.split '' # => ["1","2","3"] and it works for signed and float too # arbitrary_number=-123.45 => -123.45 # arbitrary_number.to_s.split '' => ["-", "1", "2", "3", ".", "4", "5"] kind regards -botp

on 2007-01-29 08:36

On 1/29/07, PeÃ±a, Botp <botp@delmonte-phil.com> wrote: > # arbitrary_number.to_s.split '' > # => ["1","2","3"] > > and it works for signed and float too > > # arbitrary_number=-123.45 > => -123.45 > # arbitrary_number.to_s.split '' > => ["-", "1", "2", "3", ".", "4", "5"] > > kind regards -botp that's what we did, yielding as was required, no? Cheers Robert