Я выводю набор пронумерованных файлов из сценария Ruby. Числа получены в результате увеличения счетчика, но чтобы они хорошо сортировались в каталоге, я бы хотел использовать начальные нули в именах файлов. Другими словами
file_001 ...
вместо того
file_1
Есть ли простой способ добавить начальные нули при преобразовании числа в строку? (Я знаю, что могу сделать «если меньше 10 .... если меньше 100»).
%
работает, но имеет более общее назначение.Используйте
%
оператор со строкой:Левая сторона - это строка формата printf, а правая часть может быть списком значений, так что вы можете сделать что-то вроде:
Вот шпаргалка формата printf, которую вы можете найти полезной при формировании строки формата. Формат printf изначально взят из
C
функцииprintf
, но аналогичные функции форматирования доступны в perl, ruby, python, java, php и т. Д.источник
Kernel#sprintf
, что задокументировано здесь: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintfsprintf("%03d", 5)
.Разве вы не можете просто использовать строковое форматирование значения перед тем, как указать имя файла?
источник
Используйте
String#next
в качестве счетчика.next
является относительно «умным», то есть вы можете даже пойти наисточник
Как указано в других ответах,
"%03d" % number
работает довольно хорошо, но это идет вразрез с руководством по рубиновому стилю ruby :Мы можем получить тот же результат более читабельным способом, используя следующее:
источник
format
. Если ваша цель состоит в том, чтобы сделать ваш код легким для понимания, вы должны использовать егоsprintf
, потому что он является частью стандартной C-библиотеки. Это имя используется во всех языках программирования. Чем больше людей понимают, чтоsprintf
делает, по сравнению с числом людей, которые знают, чтоformat
это псевдоним для этого. Тот факт, что что-то является частью RuboCop, не делает его по сути правильным или неправильным. Выберите правила, наиболее подходящие для вашего проекта.'%03d' % number
еще легче читать."%02d" % num
наsprintf(...)
, а затемformat(...)
на предложение, предложенное RuboCop. Затем я решил, чтоsprintf
это более привычноformat
, поэтому обновил rubocop.ymlStyle/FormatString: EnforcedStyle: sprintf
и теперь я сплю по ночам.filenames = '000'.upto('100').map { |index| "file_#{index}" }
Выходы
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]
источник