Forum: Ruby Formatting to "Thousands"

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Barrie Jarman (Guest)
on 2006-02-28 13:09
(Received via mailing list)
A colleague of mine wishes to format a float to include commas at
thousand
values, for example
12345.21 becomes
12,345.21

Is there any inbuilt functionality to format this, or are we better of
writing something ourselves...
James G. (Guest)
on 2006-02-28 15:54
(Received via mailing list)
On Feb 28, 2006, at 5:08 AM, Barrie Jarman wrote:

> A colleague of mine wishes to format a float to include commas at
> thousand
> values, for example
> 12345.21 becomes
> 12,345.21
>
> Is there any inbuilt functionality to format this, or are we better of
> writing something ourselves...

It's not built-in, but it's also pretty easy to roll one:

def commify( number )
   number.to_s.reverse.gsub!(/(\d\d\d)(?=\d)(?!\d*\.)/, '\1,').reverse
end

Hope that helps.

James Edward G. II
(Guest)
on 2006-02-28 18:16
(Received via mailing list)
I have to say, that is some great Regex Fu. I was looking to do
something similar but your solution is much nicer!
Barrie Jarman (Guest)
on 2006-02-28 18:50
(Received via mailing list)
Implemented this into the float class.
Adds check to make sure 0 is handled properly and adds for two decimal
places (sorry, probably wasn't specific enough before).

def to_finance
  if self != 0
   number = sprintf("%.2f", self)
    number.to_s.reverse.gsub!(/(\d\d\d)(?=\d)(?!\d*\.)/, '\1,').reverse
   else
    sprintf("%.2f", self)
   end
end

"James Edward G. II" <removed_email_address@domain.invalid> wrote in message
news:removed_email_address@domain.invalid...
Jeffrey S. (Guest)
on 2006-02-28 18:56
(Received via mailing list)
James Edward G. II wrote:

> def commify( number )
>   number.to_s.reverse.gsub!(/(\d\d\d)(?=\d)(?!\d*\.)/, '\1,').reverse
> end

That's nice, except that gsub! returns nil if no substitutions are
performed, e.g. if the number has fewer than 4 digits.  This can result
in an exception like:

   main.rb:3:in `commify':
     undefined method `reverse' for nil:NilClass(NoMethodError)

Of course, you could just break the chain across multiple lines:

   def commify(number)
     s = number.to_s
     s.reverse!
     s.gsub!(/(\d\d\d)(?=\d)(?!\d*\.)/, '\1,')
     s.reverse!
   end
James G. (Guest)
on 2006-02-28 18:59
(Received via mailing list)
On Feb 28, 2006, at 10:53 AM, Jeffrey S. wrote:

>   main.rb:3:in `commify':
>     undefined method `reverse' for nil:NilClass(NoMethodError)
>
> Of course, you could just break the chain across multiple lines:
>
>   def commify(number)
>     s = number.to_s
>     s.reverse!
>     s.gsub!(/(\d\d\d)(?=\d)(?!\d*\.)/, '\1,')
>     s.reverse!
>   end

Good catch.  I originally had it in multiple lines and I forgot to
remove the ! when I shortened it for this post.

Thanks.

James Edward G. II
Kevin O. (Guest)
on 2006-02-28 19:05
(Received via mailing list)
Or you could just use 'gsub' instead of 'gsub!' and avoid the nil

_Kevin
Logan C. (Guest)
on 2006-03-01 05:57
(Received via mailing list)
On Feb 28, 2006, at 11:59 AM, James Edward G. II wrote:

>> performed, e.g. if the number has fewer than 4 digits.  This can
>>     s.gsub!(/(\d\d\d)(?=\d)(?!\d*\.)/, '\1,')
>
I don't know why but using regexps to do this kind of scares me.
Maybe its cause I don't have as much regexp fu but it just seems like
ruby
ruby
perl
ruby
ruby

Not that I have anything against perl or regexps, but that particular
regexp seems to scream "I'm doing this with a regexp not because it's
easier but because it's faster and shorter." Not that that's wrong.
Hmm I seem to be trying really hard not to offend anyone :-p. I guess
a rule of thumb for me is more than 1 lookahead assertion and my eyes
glaze over ;)
Jeffrey S. (Guest)
on 2006-03-01 18:23
(Received via mailing list)
Logan C. wrote:
>>>
>>>   def commify(number)
>> Thanks.
> ruby
> ruby
>
> Not that I have anything against perl or regexps, but that particular
> regexp seems to scream "I'm doing this with a regexp not because it's
> easier but because it's faster and shorter." Not that that's wrong.  Hmm
> I seem to be trying really hard not to offend anyone :-p. I guess  a
> rule of thumb for me is more than 1 lookahead assertion and my eyes
> glaze over ;)

Try the Friedl book.  It will open your eyes. :)
This topic is locked and can not be replied to.