在Ruby中将整数转换为带符号的字符串

5

我有一个报告,其中列出了总值和括号内的变化量。例如:

Songs: 45 (+10 上周比较)

所以我想把整数10打印成“+10”,将-10打印为“-10”。

目前我正在执行以下操作

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

有更好的方式吗?
4个回答

26
"%+d" % song_change

String#% 方法可以根据字符串中的格式说明符对其右侧的内容进行格式化。格式说明符 "%d" 表示十进制整数,而添加到格式说明符中的 "+" 强制输出适当的符号。

您可以在 Kernel#sprintfsprint 的 man 手册 中了解有关格式说明符的更多信息。

您可以通过传递数组来同时格式化多个内容:

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方法。

例如:创建一个名为SignedFixnum的类,并在需要签名的时候将Fixnum对象包装在其中。


我喜欢新类的想法。也许这看起来有些过度,但我们不知道是否还有其他功能可以加入其中。或者现在可能没有,但以后可能会有。 - Shadowfirebird
这是相当简单的装饰器模式,我认为。对于小项目来说,这可能有些过度设计,但如果要经常重复使用,它可以带来巨大的收益。 - Stefan Kendall

1

Wayne已经发布了我认为是最好的选择,但这里还有另一个只是为了好玩...

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

0

我认为你的原始代码很好,只需将其提取到帮助程序中,这样它就不会混乱你的视图,并且每次想要使用它时都不必重复。

像这样将其放入application_helper.rb文件中

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接