2011-05-11 117 views
2

我存储在轨道小数的最低数量,我需要把它显示为货币这样:格式化浮到小数

11.1230 => "$11.123" 
11.1000 => "$11.10" 
11.0100 => "$11.01" 
11.1234 => "$11.1234" 

任何简单的方法来做到这一点?

+1

我认为你的规则可能需要澄清。它是否“至少有两位小数,但如果需要更多”? – Phrogz 2011-05-11 18:35:13

回答

4

如果您想以浮点形式存储,您可以在您的视图中使用number_to_currency(value)方法来打印类似$的东西。

纠正我,如果我错了(因为我很少处理货币),但我认为传统的看法是将美元价值存储为整数。这样你就不必处理时髦的浮动数学问题。

+3

是的,将价值以美分或任何最小货币价值存储为整数以避免舍入错误。然后调整所需的美元金额作为最后一步,除以100以返回正常的$ 0.00格式。 – 2011-05-11 18:18:41

+0

我认为最好的做法是使用小数 - 没有舍入问题和更少的显示工作。请参阅:http://stackoverflow.com/questions/1019939/ruby-on-rails-best-method-of-handling-currency-money – 2012-02-05 01:31:46

5

编辑:看起来这是Rails 3中具体而言,如梁2的number_with_precision方法不包括strip_insignificant_zeros选项:

你可以通过一些选项来number_to_currency(一个标准的Rails助手):

number_to_currency(11.1230, :precision => 10, :strip_insignificant_zeros => true) 
# => "$11.123" 

您需要提供精度才能使strip_insignificant_zeros选项正常工作,否则将不会调用底层的number_with_precision方法。

+0

我实际上得到$ 11.1230000000当我运行该示例 – Jake 2011-05-11 18:13:38

+0

@dmarkow我没有看到[文档](http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i- number_to_currency)中的'strip_insignificant_zeros'选项。 – Phrogz 2011-05-11 18:34:03

+0

@Jake,如果你想要更少的零,你需要降低':precision'。这些0是有效数字,所以它们不会被丢弃:http://en.wikipedia.org/wiki/Significant_figures – McStretch 2011-05-11 18:35:22

4
def pad_number(number, min_decimals=2) 
    s = "%g" % number 
    decimals = (s[/\.(\d+)/,1] || "").length 
    s << "." if decimals == 0 
    s << "0"*[0,min_decimals-decimals].max 
end 
puts [ 11.123, 11.1, 11.01, 11.1234, 11 ].map{ |n| pad_number(n) } 
#=> 11.123 
#=> 11.10 
#=> 11.01 
#=> 11.1234 
#=> 11.00 
+0

其实唯一的答案来匹配op的问题。 '11.10' – Micka 2015-04-14 08:28:25

-1

因此,将其转换为三位小数位数,然后删除最后一个当且仅当它为零。

s.sub(/0$/, '') 
+0

这不符合OP的'11.1234 =>“11.1234”测试用例' – Phrogz 2011-05-13 15:19:44