Подтвердить что ты не робот

Как преобразовать BigDecimal в строку с 2 десятичными знаками?

Я хочу преобразовать объект 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)
4b9b3361

Ответ 1

Как насчет объединения BigDecimal#truncate и String#%?

"%.2f" % BigDecimal("7.1762").truncate(2)
# => "7.17"
"%.2f" % BigDecimal("4.2").truncate(2)
# => "4.20"

Ответ 2

Простое форматирование с помощью '%.2f' должно работать

v = BigDecimal("7.1233")
"%.2f" % v #=> "7.12"

v = BigDecimal("7.1")
"%.2f" % v #=> "7.10"

Ответ 3

Было указано, что использование %.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"