当我漂亮地打印小数时,有没有办法更改它们的默认格式?
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_s
或to_f
等等,但精美印刷的全部意义在于,我不必在快速浏览之前转换我的记录。
4条答案
按热度按时间mnemlml81#
你可以对漂亮打印机使用的方法进行简单修补。“普通”IRB使用
inspect
,但大多数漂亮打印器库都有自己的方法。例如,标准库中的
pp
library使用一个名为pretty_print
的方法。遗憾的是,BigDecimal
没有自己的pretty_print
实现,它只是继承了Numeric
的实现,而Numeric
只是委托给inspect
。所以,我们可以写我们自己的!
tv6aics12#
当您使用
to_d
或to_f
时,您是在告诉Ruby将值转换为BigDouble或Float,但这并没有指定输出格式,这是一个不同的问题。Ruby支持多种类型的字符串格式,但通常需要定义一种格式,然后使用该格式“美化”输出:
请注意,输出是字符串,而不是浮点数或BigDecimal。在输出到控制台之前,所有内容都被转换为字符串。Ruby的格式字符串遵循C、Perl和许多其他语言使用的
sprintf
格式字符串。有关更多信息,请参见sprintf
。而且,虽然
sprintf
存在,但我很少看到它被使用。相反,更经常使用的是字符串的%
方法,其次是内核的format
方法。另请注意,
10.to_d / 2.5
无效,因为10
是一个整数,而Integer不知道如何计算to_d
:需要BigDecimal才能获取
to_d
:rm5edbpk3#
在Ruby 2.4中,
BigDecimal#inspect
等同于BigDecimal#to_s
,BigDecimal#to_s
始终默认使用科学计数法。幸运的是,该类接受
to_s
方法的参数,该方法允许您指定结果字符串的格式。在其他选项中,您可以指定是使用科学记数法还是传统的浮点记数法。因此,通过按如下方式使用它,您可以获得所需的结果:BigDecimal#to_s的文档详细介绍了如何设置进一步的格式选项。
不幸的是,对于您显而易见的用例,在Ruby中无法更改默认格式。为了获得浮点表示法,您总是必须显式地将
"F"
参数添加到to_s
方法。fcg9iug34#
好的,这个问题一直困扰着我,我最终决定做点什么。以下是我的解决方案:
您可以将其直接添加到.irbrc文件中。或者,如果您将其放在一个单独的文件中,您有两个选择:将其加载到.irbrc中,或者在您想要使用它的时候在控制台中手动加载它。
(请注意,
#prepend
仅在Ruby 2.0中可用。如果出于某种疯狂的原因,您仍然使用Ruby 1.x,那么您可以使用alias_method_chain
来做类似的事情。)