to_d to always return 2 decimals places in ruby

Ruby on-RailsRubyMathDecimalCurrency

Ruby on-Rails Problem Overview


I'm dealing with currencies and I want to round down the number to 2 decimal places. Even if the number is 500.0, I would like it to be 500.00 to be consistent. When I do "500.00".to_d it converts it to 500.0.

Whats a good way of changing this behavior? I also use this method to round down to 2 digits and make sure it always has 2 decimals.

def self.round_down(x, n=2)
	s = x.to_s  	
	l = s.index('.') ? s.index('.') + 1 + n : s.length
	s = s[0, l]
	s =  s.index('.') ? s.length - (s.index('.') + 1) == 1 ? s << '0' : s : s << '.00'    	
	s.to_f
end

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

In addition to mcfinnigan's answer, you can also use the following to get 2 decimal places

'%.2f' % 500 # "500.00"

This use case is known as the string format operator

Solution 2 - Ruby on-Rails

Since you are using Rails and this seems to be related to a view, there's number_with_precision:

number_with_precision(500, precision: 2)
#=> "500.00"

I18n.locale = :de
number_with_precision(500, precision: 2)
#=> "500,00"

For currencies I'd suggest number_to_currency:

number_to_currency(500)
#=> "$500.00"

Solution 3 - Ruby on-Rails

Here's a hint. 500.00 is a representation of the number 500.0

Specifically, sprintf will help you:

irb(main):004:0> sprintf "%.2f", 500.0
=> "500.00"

Solution 4 - Ruby on-Rails

Do not use floating point numbers to represent money. See this question for a good overview of why this is a bad idea.

Instead, store monetary values as integers (representing cents), or have a look at the money gem that provides lots of useful functionality for dealing with such values.

Solution 5 - Ruby on-Rails

There was a requirement to round DOWN.

Most other answers round 500.016 UP to 500.02

Try:

def self.round_down(x, n = 2)
  "%.#{n}f" % x.to_d.truncate(n)
end

irb(main):024:0> x=500.0; '%.2f' % x.to_d.truncate(2)
=> "500.00"
irb(main):025:0> x=500.016; '%.2f' % x.to_d.truncate(2)
=> "500.01"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questioned1tView Question on Stackoverflow
Solution 1 - Ruby on-RailsjvnillView Answer on Stackoverflow
Solution 2 - Ruby on-RailsStefanView Answer on Stackoverflow
Solution 3 - Ruby on-RailsmcfinniganView Answer on Stackoverflow
Solution 4 - Ruby on-RailsLars HaugsethView Answer on Stackoverflow
Solution 5 - Ruby on-RailswebaholikView Answer on Stackoverflow