Question about digits

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 1/28/07, CHubas [email protected] 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

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 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 1/28/07, Xavier N. [email protected] 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 Jan 28, 12:10 am, “Fer#” [email protected] 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

From: Fer# [mailto:[email protected]] :

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 1/29/07, Peña, Botp [email protected] 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