如何漂亮打印十进制格式

时间:2017-04-19 21:59:45

标签: ruby decimal number-formatting pretty-print

当我打印它们时,有没有办法改变小数的默认格式?

irb(main):521:0> pp 10.to_d / 2.5   
0.4e1

我想将其格式化为:

irb(main):521:0> pp 10.to_d / 2.5   
4.0

我并不十分关心潜在的精确度损失。当您正在打印Rails记录时,默认格式特别令人讨厌:

<
  ...  
  id: 49391,  
  operator_id: 1,  
  tax_rate: 0.10e2,  
  sales_price: 0.1e2,  
  unit_price: 0.2e1,  
  >

我知道我可以to_sto_f等等,但完整印刷的重点是我不需要转换我的记录才能拥有快速浏览一下他们。

3 个答案:

答案 0 :(得分:3)

你可以修补漂亮的打印机使用的方法。 “普通”IRb使用inspect,但大多数漂亮的打印机库都有自己的方法。

例如,标准库中的pp library使用名为pretty_print的方法。不幸的是,BigDecimal没有自己的pretty_print实现,它只是继承了Numeric的{​​{1}}代表inspect

所以,我们可以写自己的!

class BigDecimal
  def pretty_print(pp)
    pp.text to_s('F')
  end
end

pp 10.to_d / 2.5
# 4.0

答案 1 :(得分:1)

当您使用to_dto_f时,您告诉Ruby将值转换为BigDouble或Float,但这并未指定输出格式,这是一个不同的问题

Ruby支持几种风格的字符串格式化,但通常你会定义一种格式,然后用于&#34;漂亮打印&#34;输出:

foo = 0.4e1
'%1.1f' % foo # => "4.0"

请注意,输出是字符串,而不是Float或BigDecimal。在输出到控制台之前,所有内容都会转换为String。 Ruby的格式字符串遵循C,Perl和许多其他语言使用的sprintf格式字符串。有关详细信息,请参阅sprintf

而且,虽然存在sprintf,但我很少看到它被使用。相反,String %方法被更频繁地使用,其次是Kernel的format方法。

另请注意,10.to_d / 2.5无效,因为10是整数,而整数不知道如何to_d

10.class # => Integer
10.respond_to?(:to_d) # => false
10.to_d / 2.5    # => NoMethodError: undefined method `to_d' for 10:Integer

需要BigDecimal才能获得to_d

require 'bigdecimal'
require 'bigdecimal/util'

10.to_d / 2.5    # => 0.4e1

答案 2 :(得分:1)

在Ruby 2.4中,BigDecimal#inspect相当于BigDecimal#to_s,它总是默认使用科学记数法。

decimal = 10.to_d / 2.5
decimal.inspect
# => "0.4e1"

# equivalent to
decimal.to_s
# => "0.4e1"

幸运的是,该类接受其to_s方法的参数,该方法允许您指定结果字符串的格式。在其他选项中,您可以指定是否需要科学记数法或传统的浮点符号。因此,通过如下使用它,您可以获得所需的结果:

decimal.to_s("F")
# => "4.0"

The documentation of BigDecimal#to_s详细介绍了如何设置更多格式选项。

不幸的是,对于你明显的用例,Ruby中没有办法改变默认格式。为了获得浮点表示法,您必须明确地将"F"参数添加到to_s方法。