Formatting to "Thousands"

B

Barrie Jarman

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...
 
J

James Edward Gray II

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 Gray II
 
S

semmons99

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

Barrie Jarman

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
 
J

James Edward Gray II

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

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 Gray II
 
L

Logan Capaldo

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 Gray II

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 ;)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top