2013-04-09 24 views
33

Tôi đang xử lý đơn vị tiền tệ và tôi muốn làm tròn số xuống còn 2 chữ số thập phân. Ngay cả khi số lượng là 500.0, tôi muốn nó là 500.00 để nhất quán. Khi tôi làm "500.00" .to_d nó chuyển đổi nó thành 500.0.to_d để luôn trả về 2 số thập phân trong ruby ​​

Whats cách hay để thay đổi hành vi này? Tôi cũng sử dụng phương pháp này để làm tròn xuống 2 chữ số và đảm bảo nó luôn có 2 số thập phân.

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 

Trả lời

27

Đây là gợi ý. 500.00 là một biểu tượng của số 500.0

Cụ thể, sprintf sẽ giúp bạn:

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

Như câu tục ngữ đi, lập trình viên Bất động có thể viết C bằng ngôn ngữ * * bất kỳ! ''% .2f'% 500' là thành ngữ Ruby. –

+3

@CamilleGoudeseune Tôi đổ lỗi cho nó quá nhiều năm Java:/ – mcfinnigan

+1

sprintf rõ ràng hơn% và tôi có thể dễ dàng nhận trợ giúp về định dạng thông số bằng cách nhấn F1 trên sprintf trong IDE –

73

Ngoài câu trả lời mcfinnigan, bạn cũng có thể sử dụng sau đây để có được 2 chữ số thập phân

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

Trường hợp sử dụng này được gọi là string format operator

+0

Tôi thích nó, đơn giản, sạch sẽ, hoạt động như charm –

7

Không sử dụng số dấu phẩy động để đại diện cho tiền. Xem this question để biết tổng quan về lý do tại sao đây là một ý tưởng tồi.

Thay vào đó, lưu trữ giá trị tiền tệ làm số nguyên (đại diện cho xu) hoặc xem đá quý money cung cấp nhiều chức năng hữu ích để xử lý các giá trị đó.

26

Vì bạn đang sử dụng Rails và điều này dường như có liên quan đến một cái nhìn, có number_with_precision:

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

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

Đối với các đồng tiền tôi muốn đề nghị number_to_currency:

number_to_currency(500) 
#=> "$500.00" 
+10

@ajbraus Tôi không hiểu. Định dạng thuộc về mô hình? 'number_with_precision' và' number_to_currency' là trợ giúp * view *. – Stefan

Các vấn đề liên quan