Estou produzindo um conjunto de arquivos numerados de um script Ruby. Os números vêm do incremento de um contador, mas para classificá-los bem no diretório, eu gostaria de usar zeros à esquerda nos nomes dos arquivos. Em outras palavras
file_001 ...
ao invés de
arquivo_1
Existe uma maneira simples de adicionar zeros à esquerda ao converter um número em uma string? (Eu sei que posso fazer "se for menor que 10 ... se for menor que 100").
%
funciona, mas é de propósito mais geral.Use o
%
operador com uma string:O lado esquerdo é uma string de formato printf, e o lado direito pode ser uma lista de valores, portanto, você pode fazer algo como:
Aqui está uma folha de dicas no formato printf, que você pode achar útil na formação da string de formato. O formato printf é originalmente da
C
funçãoprintf
, mas funções de formatação semelhantes estão disponíveis em perl, ruby, python, java, php, etc.fonte
Kernel#sprintf
, que está documentado aqui: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintfsprintf("%03d", 5)
.Você não pode simplesmente usar a formatação de string do valor antes de concat o nome do arquivo?
fonte
Use
String#next
como contador.next
é relativamente "inteligente", o que significa que você pode atéfonte
Conforme declarado nas outras respostas,
"%03d" % number
funciona muito bem, mas vai contra o guia de estilo do rubocop ruby :Podemos obter o mesmo resultado de maneira mais legível usando o seguinte:
fonte
format
. Se seu objetivo é facilitar a compreensão do seu código, você deve usá-sprintf
lo, porque ele faz parte da biblioteca C padrão. Este nome é usado em linguagens de programação. Muito mais pessoas entendem o quesprintf
fazem, em comparação com o número que sabe queformat
é um alias para ele. Só porque algo faz parte do RuboCop não o torna inerentemente certo ou errado. Escolha as regras que fazem mais sentido para o seu projeto.'%03d' % number
é ainda mais fácil de ler."%02d" % num
parasprintf(...)
, em seguida, deformat(...)
acordo com a sugestão do RuboCop. Decidi então quesprintf
era mais convencional do que oformat
rubocop.yml atualizadoStyle/FormatString: EnforcedStyle: sprintf
e que agora durmo bem à noite.filenames = '000'.upto('100').map { |index| "file_#{index}" }
Saídas
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]
fonte