Estoy sacando un conjunto de archivos numerados de un script Ruby. Los números provienen de incrementar un contador, pero para que se clasifiquen bien en el directorio, me gustaría usar ceros a la izquierda en los nombres de archivo. En otras palabras
file_001 ...
en vez de
archivo_1
¿Hay una manera simple de agregar ceros al convertir un número a una cadena? (Sé que puedo hacer "si menos de 10 ... si menos de 100").
%
funciona pero tiene un propósito más general.Use el
%
operador con una cadena:El lado izquierdo es una cadena de formato printf, y el lado derecho puede ser una lista de valores, por lo que podría hacer algo como:
Aquí hay una hoja de trucos en formato printf que puede ser útil para formar su cadena de formato. El formato printf es originalmente de la
C
funciónprintf
, pero hay funciones de formateo similares disponibles en perl, ruby, python, java, php, etc.fuente
Kernel#sprintf
, que se documenta aquí: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintfsprintf("%03d", 5)
.¿No puedes usar el formato de cadena del valor antes de concatenar el nombre del archivo?
fuente
Úselo
String#next
como el contador.next
es relativamente 'inteligente', lo que significa que incluso puedes ir porfuente
Como se indica en las otras respuestas,
"%03d" % number
funciona bastante bien, pero va en contra de la guía de estilo rubocop ruby :Podemos obtener el mismo resultado de una manera más legible usando lo siguiente:
fuente
format
. Si su objetivo es hacer que su código sea fácil de entender, debe usarlosprintf
porque es parte de la biblioteca C estándar. Este nombre se usa en todos los lenguajes de programación. Más personas entienden lo quesprintf
hace, en comparación con el número que sabe queformat
es un alias para ello. El hecho de que algo sea parte de RuboCop no lo hace intrínsecamente correcto o incorrecto. Elija las reglas que tengan más sentido para su proyecto.'%03d' % number
Es aún más fácil de leer."%02d" % num
asprintf(...)
, luego aformat(...)
la sugerencia de RuboCop. Entonces decidí quesprintf
era más convencional queformat
, así que actualicé rubocop.yml conStyle/FormatString: EnforcedStyle: sprintf
y ahora duermo bien por la noche.filenames = '000'.upto('100').map { |index| "file_#{index}" }
Salidas
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]
fuente