2017-04-19 69 views
0

當我漂亮地打印它們時,是否有辦法更改小數的默認格式?如何漂亮地打印十進制格式

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等,但漂亮地打印的整點是我不在我能夠快速瀏覽他們之前,不必轉換我的記錄。

回答

2

你可以猴子打補丁打印機使用的方法。「正常」IRB使用inspect,但大多數漂亮打印機庫都有自己的方法。

例如,來自標準庫的pp library使用名爲pretty_print的方法。 BigDecimal不具有自己的實現pretty_print不幸的是,它只是繼承Numeric,它只是代表inspect

所以,我們可以自己寫!

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

pp 10.to_d/2.5 
# 4.0 
+0

謝謝,正是我在找的東西! – Zyphrax

1

當您使用to_dto_f時,您告訴Ruby將該值轉換爲BigDouble或Float,但沒有指定輸出格式,這是一個不同的問題。

Ruby支持字符串格式化一對夫婦的口味,但一般可以定義,然後用「漂亮打印」輸出格式:

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

注意輸出是一個字符串,而不是浮動或BigDecimal。在輸出到控制檯之前,所有內容都轉換爲字符串。 Ruby的格式字符串遵循C,Perl和許多其他語言使用的sprintf格式字符串。有關更多信息,請參閱sprintf

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

還要注意的是10.to_d/2.5是無效的,因爲10是一個整數,和Integer不知道如何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 
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方法中。