2011-05-11 299 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