chubas
January 28, 2007, 12:35am
1
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?
chubas
January 28, 2007, 12:58am
2
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
chubas
January 28, 2007, 1:15am
3
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
chubas
January 28, 2007, 1:03am
4
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
chubas
January 28, 2007, 1:49am
5
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|
chubas
January 28, 2007, 2:25pm
6
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
chubas
January 29, 2007, 2:13am
7
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
chubas
January 29, 2007, 8:36am
8
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