Преобразовать целое число в подписанную строку в Ruby - PullRequest
5 голосов
/ 05 марта 2010

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

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

Итак, я хочу напечатать целое число 10 как «+10» и -10 как «-10»

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

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

Есть ли лучший способ?

Ответы [ 4 ]

26 голосов
/ 05 марта 2010
"%+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)
1 голос
/ 06 марта 2010

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

"#{'+' if song_change >= 0}#{song_change}"
1 голос
/ 05 марта 2010

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

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

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

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

0 голосов
/ 05 марта 2010

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

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

  def display_song_change
    (song_change >= 0 ? '+' : '') + song_change.to_s
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...