我想将BigDecimal对象转换为货币值到两位小数。我不想要任何四舍五入。我该怎么办?
以下方法均无效:
v = BigDecimal("7.1762")
w = BigDecimal("4.2")
v.to_s('2F') # => "7.17 62"
v.to_s('F') # => "7.1762"
v.to_s('%0.2F') # => "0.71762E1"
v.to_s('%0.2f') # => "0.71762E1"
v.truncate(2).to_s('F') # => "7.17" # This one looks like it worked
w.truncate(2).to_s('F') # => "4.2" # But it doesn't pad with the trailing zero(es)
答案 0 :(得分:19)
如何合并BigDecimal#truncate
和String#%
? :
"%.2f" % BigDecimal("7.1762").truncate(2)
# => "7.17"
"%.2f" % BigDecimal("4.2").truncate(2)
# => "4.20"
答案 1 :(得分:4)
只需使用'%.2f'
格式化即可
v = BigDecimal("7.1233")
"%.2f" % v #=> "7.12"
v = BigDecimal("7.1")
"%.2f" % v #=> "7.10"
答案 2 :(得分:4)
有人指出,使用%.2f % v
会导致v
被转换为浮点数,从而导致精度/准确度的潜在损失(例如"%.2f" % (10**24) == "999999999999999983222784.00"
)
根据falsetru对已接受答案的评论,您可以使用.to_s("F")
转换为字符串。这将返回定点格式的数字,带小数点。如果在数字的末尾添加“00”,则可以使用正则表达式/.*\..{2}/
(任意字符;小数点;再多两个字符)将其删除,因此它只保留小数点后的两位数点。
w = BigDecimal("4.2")
w.truncate(2).to_s("F") # => "4.2"
(w.truncate(2).to_s("F") + "00") # => "4.2000"
(w.truncate(2).to_s("F") + "00")[ /.*\..{2}/ ] # => "4.20"
答案 3 :(得分:0)
尽管有些冗长,我认为这应该可以工作
money_amount = BigDecimal.new(100)
money_amount.truncate(2).to_s('F').ljust(money_amount.truncate(0).to_s('F').length + 1, '0')