Formatting to "Thousands"


#1

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…


#2

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


#3

I have to say, that is some great Regex Fu. I was looking to do
something similar but your solution is much nicer!


#4

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 methodreverse’ 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


#5

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…


#6

On Feb 28, 2006, at 10:53 AM, Jeffrey S. wrote:

main.rb:3:in commify': undefined methodreverse’ 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


#7

Or you could just use ‘gsub’ instead of ‘gsub!’ and avoid the nil

_Kevin


#8

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 :wink:


#9

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 :wink:

Try the Friedl book. It will open your eyes. :slight_smile: