格式化浮到小数
我存储在轨道小数的最低数量,我需要把它显示为货币这样:格式化浮到小数
11.1230 => "$11.123"
11.1000 => "$11.10"
11.0100 => "$11.01"
11.1234 => "$11.1234"
任何简单的方法来做到这一点?
如果您想以浮点形式存储,您可以在您的视图中使用number_to_currency(value)方法来打印类似$的东西。
纠正我,如果我错了(因为我很少处理货币),但我认为传统的看法是将美元价值存储为整数。这样你就不必处理时髦的浮动数学问题。
是的,将价值以美分或任何最小货币价值存储为整数以避免舍入错误。然后调整所需的美元金额作为最后一步,除以100以返回正常的$ 0.00格式。 – 2011-05-11 18:18:41
我认为最好的做法是使用小数 - 没有舍入问题和更少的显示工作。请参阅:http://stackoverflow.com/questions/1019939/ruby-on-rails-best-method-of-handling-currency-money – 2012-02-05 01:31:46
编辑:看起来这是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
方法。
我实际上得到$ 11.1230000000当我运行该示例 – Jake 2011-05-11 18:13:38
@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
@Jake,如果你想要更少的零,你需要降低':precision'。这些0是有效数字,所以它们不会被丢弃:http://en.wikipedia.org/wiki/Significant_figures – McStretch 2011-05-11 18:35:22
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
其实唯一的答案来匹配op的问题。 '11.10' – Micka 2015-04-14 08:28:25
因此,将其转换为三位小数位数,然后删除最后一个当且仅当它为零。
s.sub(/0$/, '')
这不符合OP的'11.1234 =>“11.1234”测试用例' – Phrogz 2011-05-13 15:19:44
我认为你的规则可能需要澄清。它是否“至少有两位小数,但如果需要更多”? – Phrogz 2011-05-11 18:35:13