Подтвердить что ты не робот

Как заставить строку Ruby содержать n символов

Как принудительно вывести строковый переменный Ruby с помощью puts в n символов, чтобы, если переменная длиннее, она будет усечена, если будет короче, она будет расширена за конечными или ведущими пробелами?

Есть ли какой-нибудь стандартный метод для этого?

4b9b3361

Ответ 1

Ruby поддерживает строки формата, как и многие другие языки:

[11] (pry) main: 0> '%3.3s' % 'f'
=> "  f"
[12] (pry) main: 0> '%3.3s' % 'foo'
=> "foo"
[13] (pry) main: 0> '%3.3s' % 'foobar'
=> "foo"

Если вы хотите поместить справа, используйте - в строке формата:

[14] (pry) main: 0> '%-3.3s' % 'f'
=> "f  "
[15] (pry) main: 0> '%-3.3s' % 'foo'
=> "foo"
[16] (pry) main: 0> '%-3.3s' % 'foobar'
=> "foo"

Вы также можете использовать printf или sprintf, но я предпочитаю более общий %, который похож на sprintf.

Из sprintf docs:

  s   | Argument is a string to be substituted.  If the format
      | sequence contains a precision, at most that many characters
      | will be copied.

и

-        | all           | Left-justify the result of this conversion.

Что делать, если я хочу использовать не пробелы, а какой-то другой символ?

Базовый код Ruby написан на C, и он жестко закодирован для использования ' ' в качестве символа прокладки, так что это невозможно сразу, если вы не хотите изменять источник, перекомпилировать свой Ruby и жить с одним - версия версии языка. Вместо этого вы можете сделать что-то вроде:

[17] (pry) main: 0> ('%-3.3s' % 'f').gsub(' ', '.')
=> "f.."

Это намного сложнее, чем просто gsub. Часто лучше настроить строку без использования форматированных строк, если вам нужно указать специальные символы. Строки формата очень мощные, но они не являются полностью гибкими.

В противном случае я бы пошел с чем-то вроде решения @steenslag, которое станет основой для вашего собственного. Вы теряете возможность использовать строки форматирования и должны полагаться на конкатенирование строк или что-то подобное, чтобы получить столбчатый вывод, но он также будет работать.

Ответ 2

Чтобы сделать строку фиксированной длиной короче:

  str_var.slice(1..10)

Чтобы сделать строку фиксированной длиной дольше:

  str_var.ljust(10, ' ')

Их можно объединить в нечто вроде:

  (str_var.length > 10) ? str_var.slice(1..10) : str_var.ljust(10, ' ')

Где str_var, конечно, ваша строка

Ответ 3

class String
  def fix(size, padstr=' ')
    self[0...size].rjust(size, padstr) #or ljust
  end
end

p 'lettersletters'.fix(9) #=> "lettersle"
p 'letters'.fix(10, '.')  #=> "...letters"

Объединяет метод slice ([]) с rjust.

Ответ 4

Для чистого Ruby один лайнер вы можете сделать это:

(str + ' ' * length)[0,length]

Что даст:

str = "Hello"
length = 10
=> "Hello     "

или

str = "Hello"
length = 2
=> "He"

Ответ 5

Если вы говорите о методе усечения строк, я бы посмотрел ActionView:: Helpers:: TextHelper # truncate

Из примеров:

truncate("Once upon a time in a world far far away")

# => Once upon a time in a world...