我有一个报告,其中列出了总值和括号内的变化量。例如:
Songs: 45 (+10 上周比较)
所以我想把整数10打印成“+10”,将-10打印为“-10”。
目前我正在执行以下操作
(song_change >= 0 ? '+' : '') + song_change.to_s
有更好的方式吗?
"%+d" % song_change
String#% 方法可以根据字符串中的格式说明符对其右侧的内容进行格式化。格式说明符 "%d" 表示十进制整数,而添加到格式说明符中的 "+" 强制输出适当的符号。
您可以在 Kernel#sprintf 或 sprint 的 man 手册 中了解有关格式说明符的更多信息。
您可以通过传递数组来同时格式化多个内容:
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方法。
例如:创建一个名为SignedFixnum的类,并在需要签名的时候将Fixnum对象包装在其中。
Wayne已经发布了我认为是最好的选择,但这里还有另一个只是为了好玩...
"#{'+' if song_change >= 0}#{song_change}"
我认为你的原始代码很好,只需将其提取到帮助程序中,这样它就不会混乱你的视图,并且每次想要使用它时都不必重复。
像这样将其放入application_helper.rb文件中
def display_song_change
(song_change >= 0 ? '+' : '') + song_change.to_s
end