2010-03-05 74 views
5

我有一份報告,其中列出了總值,然後更改爲括號。例如:在Ruby中將整數轉換爲簽名字符串

歌曲:45(+10從上週)

所以我想打印整數10 「+10」 和-10爲 「-10」

現在我在做

(song_change >= 0 ? '+' : '') + song_change.to_s 

有沒有更好的方法?

回答

25
"%+d" % song_change 

String#%根據字符串中的打印說明符格式化右側。打印說明符「%d」表示小數點aka。整數,並且添加到打印說明符的「+」強制始終打印適當的符號。

有關打印說明符的更多信息,請參閱Kernel#sprintfman page for sprinf

你可以通過在陣列中一次格式化多個件事:

song_count = 45 
song_change = 10 
puts "Songs: %d (%+d from last week)" % [song_count, song_change] 
# => Songs: 45 (+10 from last week) 
1

你可以添加一個方法到Fixnum,調用to_signed_s,但這可能是矯枉過正。然而,你會消除複製和粘貼,這很好。

個人,我只是寫一個StringUtil類來處理轉換。

或者,更好的面向對象解決方案是將FixNum包裝在持有者類中並覆蓋該類的to_s。

IE:創建一個名爲SignedFixnum的類,並在其需要簽名時將Fixnum對象包裹在其中。

+0

我喜歡一個新班級的想法。也許這似乎過度殺傷,但對於我們所知道的,可能會有一堆其他功能可以進入。或者也許還沒有,但會有更晚的時間。 – Shadowfirebird 2010-03-05 22:17:23

+0

這是非常簡單的裝飾模式,我想。對於小型項目來說這是過分的,但如果這要重複使用,它可能會帶來巨大收益。 – 2010-03-06 04:07:43

0

我認爲你原來的代碼是好的,只是提取出來變成一個幫手,因此不會弄亂你的看法而且每次你​​想使用它時都不必重複它。

把它放在你application_helper.rb文件中像這樣

def display_song_change 
    (song_change >= 0 ? '+' : '') + song_change.to_s 
    end 
1

韋恩已經發布我認爲是最好的選擇,但這裏的另外一個只是爲了好玩...

"#{'+' if song_change >= 0}#{song_change}"