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…
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…
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.21Is 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
I have to say, that is some great Regex Fu. I was looking to do
something similar but your solution is much nicer!
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
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” [email protected] wrote in message
news:[email protected]…
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
Or you could just use ‘gsub’ instead of ‘gsub!’ and avoid the nil
_Kevin
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
Logan C. wrote:
def commify(number)
Thanks.
ruby
rubyNot 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 forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs