2009-10-09 25 views
182

Estoy generando un conjunto de archivos numerados de un script de 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¿Cómo puedo generar ceros a la izquierda en Ruby?

file_001 ...

en lugar de

file_1

¿Hay un sencilla manera de añadir ceros a la izquierda al convertir un número a ¿una cuerda? (Sé que puedo hacer "si es menor que 10 ... si es menor que 100").

Respuesta

212

Si se conoce el número máximo de dígitos en el contador (por ejemplo, n = 3 para los contadores 1..876), se puede hacer

str = "file_" + i.to_s.rjust(n, "0") 
+3

Heh heh, no es la mejor respuesta, pero no sabía sobre rjust y he estado usando ruby ​​durante años. ¡Aclamaciones! – pauliephonic

+0

Tengo que votar esto porque parece que% 03s pads con espacios por alguna razón impar (% 03d parece funcionar bien). Podría haber jurado que C rellenó con ceros en ambos casos. – Nerdmaster

+0

Finalmente cambié esto para ser la respuesta aceptada porque es el más simple y fácil de recordar. '%' funciona, pero es más general. –

296

Uso del operador % con una cadena:

irb(main):001:0> "%03d" % 5 
=> "005" 

La mano del 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 :

irb(main):002:0> filename = "%s/%s.%04d.txt" % ["dirname", "filename", 23] 
=> "dirname/filename.0023.txt" 

He aquí una printf format cheat sheet le puede resultar útil en la formación de la cadena de formato. El formato de printf es originario de la función printfC, pero las funciones de formateo similares están disponibles en Perl, Ruby, Python, Java, PHP, etc.

+1

Genial! Entonces, "% s" significa "sustituye aquí el valor Nth" y "% 03d" significa "sustituye un número aquí, agregando tantos ceros como sea necesario para convertirlo en un número de 3 dígitos". (Supongo que d significa "dígitos"). Veo la documentación sobre esto ahora (http://www.ruby-doc.org/core/classes/String.html#M000770), pero es muy conciso y Me gustaría un poco de elaboración. –

+1

Agregué un enlace a una hoja de trucos de formato printf. "s" significa "cadena", "d" significa "número decimal". El "03", significa "pad a 3 caracteres con ceros"; "% 3d" se rellenaría a la izquierda con espacios. –

+0

¡Genial! Gracias por la útil explicación. –

38

¿No puedes usar string formatting del valor antes de ConCat el nombre del archivo?

"%03d" % number 
+0

Creo que esta respuesta no agrega nada a la respuesta de @Daniel Martin, sin embargo me gusta su simplicidad ... – SsouLlesS

+1

Respondió en el mismo minuto que Daniel Martin, por lo que probablemente no estaba al tanto de la duplicación. –

+0

El mundo no es justo. – Santhosh

20

Uso String#next como el mostrador.

>> n = "000" 
>> 3.times { puts "file_#{n.next!}" } 
file_001 
file_002 
file_003 
Cuestiones relacionadas