From: David Vallner Date: 2006-02-09T11:27:38+09:00 Subject: Re: Formatting Numbers Dňa Štvrtok 09 Február 2006 03:11 Logan Capaldo napísal: > On Feb 8, 2006, at 8:43 PM, HH wrote: > > 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