我有一份报告,其中列出了总值,然后更改为括号。例如:在Ruby中将整数转换为签名字符串
歌曲:45(+10从上周)
所以我想打印整数10 “+10” 和-10为 “-10”
现在我在做
(song_change >= 0 ? '+' : '') + song_change.to_s
有没有更好的方法?
我有一份报告,其中列出了总值,然后更改为括号。例如:在Ruby中将整数转换为签名字符串
歌曲:45(+10从上周)
所以我想打印整数10 “+10” 和-10为 “-10”
现在我在做
(song_change >= 0 ? '+' : '') + song_change.to_s
有没有更好的方法?
"%+d" % song_change
String#%根据字符串中的打印说明符格式化右侧。打印说明符“%d”表示小数点aka。整数,并且添加到打印说明符的“+”强制始终打印适当的符号。
有关打印说明符的更多信息,请参阅Kernel#sprintf或man 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)
你可以添加一个方法到Fixnum,调用to_signed_s,但这可能是矫枉过正。然而,你会消除复制和粘贴,这很好。
个人,我只是写一个StringUtil类来处理转换。
或者,更好的面向对象解决方案是将FixNum包装在持有者类中并覆盖该类的to_s。
IE:创建一个名为SignedFixnum的类,并在其需要签名时将Fixnum对象包裹在其中。
我认为你原来的代码是好的,只是提取出来变成一个帮手,因此不会弄乱你的看法而且每次你想使用它时都不必重复它。
把它放在你application_helper.rb文件中像这样
def display_song_change
(song_change >= 0 ? '+' : '') + song_change.to_s
end
韦恩已经发布我认为是最好的选择,但这里的另外一个只是为了好玩...
"#{'+' if song_change >= 0}#{song_change}"
我喜欢一个新班级的想法。也许这似乎过度杀伤,但对于我们所知道的,可能会有一堆其他功能可以进入。或者也许还没有,但会有更晚的时间。 – Shadowfirebird 2010-03-05 22:17:23
这是非常简单的装饰模式,我想。对于小型项目来说这是过分的,但如果这要重复使用,它可能会带来巨大收益。 – 2010-03-06 04:07:43