Преобразуйте целое число в строку со знаком в Ruby

У меня есть отчет, в котором я перечисляю итоговые значения и затем изменяюсь в круглых скобках. Например:

Песни: 45 (+10 с прошлой недели)

Таким образом, я хочу распечатать целое число 10 как "+10" и-10 как "-10"

Прямо сейчас я делаю

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

Существует ли лучший путь?

5
задан Tom Lehman 5 March 2010 в 19:25
поделиться

4 ответа

"%+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)
26
ответ дан 18 December 2019 в 05:55
поделиться

Уэйн уже опубликовал то, что я считаю лучшим вариантом, но вот еще один, просто для удовольствия ...

"#{'+' if song_change >= 0}#{song_change}"
1
ответ дан 18 December 2019 в 05:55
поделиться

Я думаю, что ваш оригинальный код хорош, просто извлеките его в помощник, чтобы он не загромождал ваши представления и вам не приходилось повторять его каждый раз, когда вы хотите его использовать.

Поместите его в файл application_helper.rb вот так

  def display_song_change
    (song_change >= 0 ? '+' : '') + song_change.to_s
  end
0
ответ дан 18 December 2019 в 05:55
поделиться

Вы можете добавить в Fixnum метод с именем to_signed_s, но это может оказаться излишним. Однако вы бы исключили копирование и вставку, что было бы хорошо.

Лично я бы просто написал класс StringUtil для обработки преобразования.

В качестве альтернативы, лучшим объектно-ориентированным решением было бы заключить FixNum в класс-держатель и переопределить to_s ТОГО класса.

IE: создайте класс SignedFixnum и оберните в него свои объекты Fixnum всякий раз, когда они должны быть подписаны.

1
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: