2010-03-05 70 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}"