如何将BigDecimal转换为2位小数字符串?

时间:2014-07-23 16:07:47

标签: ruby string

我想将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)

4 个答案:

答案 0 :(得分:19)

如何合并BigDecimal#truncateString#%? :

"%.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')