Dňa Štvrtok 09 Február 2006 03:11 Logan Capaldo napísal:
> This has got to be simple but I checked the PickAxe and Google to
> no avail.
> My guess is that I'm looking for it in terms that don't make sense.
>
> Anyway...
>
> I have a fixnum:
>
> a = 1000
>
> I would like to output it with a comma, such as "1,000". Is there a
> formatting class or something I can use something along these lines
> (thinking from my Java background):
>
> Formatter f = Formatter.new("N0")
> puts f(a)
>
> Any help appreciated.
>
> Thanks,
> Hunter
I dunno know about some kind of builtin format object (I imagine
maybe the right incantation of sprintf could do it) but heres a
method (kinda long for what it is, theres probably some regex to do
it in one fell swoop):
% cat commify.rb
require 'enumerator'
def commify(num)
str = num.to_s
a =
str.split(//).reverse.each_slice(3) { |slice| a << slice }
new_a =
a.each do |item|
new_a << item
new_a << [","]
end
new_a.delete_at(new_a.length - 1)
new_a.flatten.reverse.join
end
p commify(1000)
p commify(100)
p commify(1_000_000)
p commify(1024)
% ruby commify.rb
"1,000"
"100"
"1,000,000"
"1,024"
Hmm, I was in the middle of writing precisely this sort of hack as this
arrived. That said, much better job here. The #each_slice comes from the
enumerator library? I should really learn to use that one...
That said, I'm almost sure you can golf that thing down a bit. How about:
require 'enumerator'
def commify(num)
str = num.to_s
a =
str.split(//).reverse.each_slice(3) { |slice| a << slice }
a.reverse.collect{|i| i.reverse.join}.join(",")
end
p commify(1000)
p commify(100)
p commify(1_000_000)
p commify(1024)
Now if only we directly had a method to slice an Array into an Array of
slices, the whole thing could turn into a one-liner. Which I hate, but in a
good way.
David Vallner
···
On Feb 8, 2006, at 8:43 PM, HH wrote: