У меня есть отчет, в котором я перечисляю итоговые значения и затем изменяюсь в круглых скобках. Например:
Песни: 45 (+10 с прошлой недели)
Таким образом, я хочу распечатать целое число 10 как "+10" и-10 как "-10"
Прямо сейчас я делаю
(song_change >= 0 ? '+' : '') + song_change.to_s
Существует ли лучший путь?
"%+d" % song_change
String#% форматирует правую часть в соответствии со спецификаторами печати в строке. Спецификатор печати "%d" означает десятичную дробь, а не целое число, а "+", добавленный к спецификатору печати, заставляет всегда печатать соответствующий знак.
Подробнее о спецификаторах печати можно узнать в Kernel#sprintf, или в man-странице для sprinf.
Вы можете форматировать несколько вещей одновременно, передавая массив:
song_count = 45
song_change = 10
puts "Songs: %d (%+d from last week)" % [song_count, song_change]
# => Songs: 45 (+10 from last week)
Уэйн уже опубликовал то, что я считаю лучшим вариантом, но вот еще один, просто для удовольствия ...
"#{'+' if song_change >= 0}#{song_change}"
Я думаю, что ваш оригинальный код хорош, просто извлеките его в помощник, чтобы он не загромождал ваши представления и вам не приходилось повторять его каждый раз, когда вы хотите его использовать.
Поместите его в файл application_helper.rb вот так
def display_song_change
(song_change >= 0 ? '+' : '') + song_change.to_s
end
Вы можете добавить в Fixnum метод с именем to_signed_s, но это может оказаться излишним. Однако вы бы исключили копирование и вставку, что было бы хорошо.
Лично я бы просто написал класс StringUtil для обработки преобразования.
В качестве альтернативы, лучшим объектно-ориентированным решением было бы заключить FixNum в класс-держатель и переопределить to_s ТОГО класса.
IE: создайте класс SignedFixnum и оберните в него свои объекты Fixnum всякий раз, когда они должны быть подписаны.