Ruby on Rails: Como você adiciona zeros na frente de um número se ele for menor que 10?

110

Estou tentando converter números de um único dígito em números de dois dígitos assim:

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

Eu acho que poderia colocar um monte de instruções if-else (se o número for menor que 10, então faça um gsub), mas acho que é uma codificação horrível. Eu sei que Rails tem number_with_precision, mas vejo que só se aplica a números decimais. Alguma ideia sobre como converter um dígito em dois dígitos?

sjsc
fonte

Respostas:

142

Você quis dizer sprintf '%02d', n?

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

Você pode querer fazer referência à tabela de formatossprintf no futuro, mas para este exemplo particular '%02d'significa imprimir um inteiro ( d) ocupando pelo menos 2 caracteres ( 2) e preenchendo à esquerda com zeros em vez de espaços ( 0).

Mark Rushakoff
fonte
Obrigado Mark !! Perfeito =) Obrigado!
sjsc
Você provavelmente deve usar %02ipara este caso, pois é mais óbvio que a saída é e deve ser um número inteiro, d é menos intuitivo para pessoas que não estão tão acostumadas a usar sprintf.
SeanJA
você pode simplesmente '%02d'%1sem sprintf
Qiushi Huang
194

Muitas pessoas estão usando sprintf(que é a coisa certa a se fazer), e eu acho que se você quiser fazer isso com uma string , é melhor ter em mente os métodos rjuste ljust:

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

Isso tornará o "4"direito justificado, garantindo que tenha pelo menos 2caracteres de comprimento e o preencherá com '0'. ljustfaz o oposto.

Ryan Bigg
fonte
2
Isso só é melhor do que sprintf se você quiser permitir strings. Caso contrário, eu usaria sprintf, uma vez que ele lança uma exceção (como deveria) se eu acidentalmente usar uma string.
Velizar Hristov
Se você sabe que está começando com uma representação de string de um número, gosto mais disso do que do sprintf para desempenho. O uso rjustevita o custo de analisar a string de formato de sprintf, convertendo uma string em um número e convertendo esse número de volta em uma string. Além disso, é (indiscutivelmente) fácil para um ser humano entender o que o código está tentando fazer à primeira vista.
David Hempy