2010-04-22 6 views
94

Busco para convertir los números de un solo dígito a números de dos dígitos, así:Ruby on Rails: ¿cómo se agregan los ceros al frente de un número si es menor de 10?

9 ==> 09 
5 ==> 05 
12 == 12 
4 ==> 04 

Calculo que podría poner un montón de else if-(si el número es menor de 10, y luego hacer un gsub) pero imagina que es una codificación horrible. Sé que Rails tiene number_with_precision, pero veo que solo se aplica a números decimales. ¿Alguna idea sobre cómo convertir de un solo dígito a dos dígitos?

Respuesta

124

Quizás quiso decir sprintf '%02d', n?

irb(main):003:0> sprintf '%02d', 1 
=> "01" 
irb(main):004:0> sprintf '%02d', 10 
=> "10" 

Es posible que desee hacer referencia a la format table for sprintf en el futuro, pero para este ejemplo en particular '%02d' medios para imprimir un número entero (d) teniendo al menos 2 caracteres (2) y de izquierda rellenando con ceros en lugar de espacios (0).

+0

Gracias Mark !! Perfecto =) ¡Gracias! – sjsc

+0

Probablemente deberías usar '% 02i' para este caso ya que es más obvio que el resultado es y se supone que es un entero, d es menos intuitivo para las personas que no están tan acostumbradas a usar' sprintf'. – SeanJA

6

Prueba de esto, que debería funcionar:

abc= 5 
puts "%.2i" %abc >> 05 


abc= 5.0 
puts "%.2f" %abc >> 5.00 
+0

Impresionante, Exactamente lo que estaba buscando. ¿Hay documentación disponible o cómo has llegado a aprender sobre ella? – TheMouseMan

167

Una gran cantidad de personas que utilizan sprintf (que es lo que hay que hacer), y creo que si usted quiere hacer esto para una cadena que es mejor tener en cuenta los rjust y métodos: ljust

"4".rjust(2, '0') 

Esto hará que el "4" justificado a la derecha, asegurando que es al menos un 2 caracteres d pad con '0'. ljust hace lo contrario.

+2

Esto es solo mejor que sprintf si quieres permitir cadenas. De lo contrario, usaría sprintf, ya que arroja una excepción (como debería) si accidentalmente uso una cadena. –