Ruby on Rails: ¿Cómo se agregan ceros delante de un número si es menor de 10?

110

Estoy buscando convertir números de un solo dígito en números de dos dígitos así:

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

Me imagino que podría poner un montón de declaraciones if-else (si el número es menor de 10, entonces haga un gsub) pero imagino 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 dígitos de un solo dígito en dos dígitos?

sjsc
fuente

Respuestas:

142

¿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 tabla de formatosprintf en el futuro, pero para este ejemplo en particular, '%02d'significa imprimir un entero ( d) que ocupe al menos 2 caracteres ( 2) y el relleno a la izquierda con ceros en lugar de espacios ( 0).

Mark Rushakoff
fuente
Gracias Mark !! Perfecto =) ¡Gracias!
sjsc
Probablemente debería usar %02ipara este caso, ya que es más obvio que la salida es y se supone que es un número entero, d es menos intuitivo para las personas que no están acostumbradas a usar sprintf.
SeanJA
simplemente puede '%02d'%1sin sprintf
Qiushi Huang
194

Mucha gente usa sprintf(que es lo correcto), y creo que si desea hacer esto para una cadena , es mejor tener en cuenta los métodos rjusty ljust:

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

Esto hará que el "4"derecho esté justificado asegurándose de que tenga al menos 2caracteres de longitud y relleno '0'. ljusthace lo contrario.

Ryan Bigg
fuente
2
Esto solo es mejor que sprintf si desea permitir cadenas. De lo contrario, usaría sprintf, ya que arroja una excepción (como debería) si uso accidentalmente una cadena.
Velizar Hristov
Si sabe que está comenzando con una representación de cadena de un número, me gusta más esto que sprintf para el rendimiento. El uso rjustevita el costo de analizar la cadena de formato de sprintf, convertir una cadena en un número y volver a convertir ese número en una cadena. Además, es (posiblemente) fácil para un humano entender lo que el código está tratando de hacer de un vistazo.
David Hempy