Ruby on Rails: Jak dodać zera przed liczbą, jeśli jest poniżej 10?

110

Chcę przekonwertować liczby jednocyfrowe na liczby dwucyfrowe, na przykład:

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

Myślę, że mógłbym umieścić kilka instrukcji if-else (jeśli liczba jest mniejsza niż 10, zrób gsub), ale to okropne kodowanie. Wiem, że Railsy mają number_with_precision, ale widzę, że dotyczy to tylko liczb dziesiętnych. Jakieś pomysły, jak zamienić pojedyncze cyfry na dwucyfrowe?

sjsc
źródło

Odpowiedzi:

142

Czy miałeś na myśli sprintf '%02d', n?

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

W przyszłości możesz chcieć odwołać się do tabeli formatówsprintf , ale w tym konkretnym przykładzie '%02d'oznacza to wydrukowanie liczby całkowitej ( d) składającej się z co najmniej 2 znaków ( 2) i wypełnionej po lewej stronie zerami zamiast spacji ( 0).

Mark Rushakoff
źródło
Dziękuję Mark !! Perfect =) Dziękuję!
sjsc
Prawdopodobnie powinieneś użyć %02iw tym przypadku, ponieważ jest bardziej oczywiste, że wynik jest i powinien być liczbą całkowitą, d jest mniej intuicyjny dla osób, które nie są tak przyzwyczajone do używania sprintf.
SeanJA
możesz po prostu '%02d'%1bez sprintu
Qiushi Huang
194

Wiele osób używa sprintf(co jest słuszne) i myślę, że jeśli chcesz to zrobić dla ciągu znaków , najlepiej pamiętać o metodach rjusti ljust:

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

Spowoduje to, że "4"prawo będzie uzasadnione, upewniając się, że ma co najmniej 2znaki i dopełnia je '0'. ljustrobi odwrotnie.

Ryan Bigg
źródło
2
Jest to lepsze niż sprintf tylko wtedy, gdy chcesz zezwolić na ciągi. W przeciwnym razie użyłbym sprintf, ponieważ zgłasza wyjątek (tak jak powinien), jeśli przypadkowo użyję ciągu.
Velizar Hristov
Jeśli wiesz, że zaczynasz od ciągu reprezentującego liczbę, podoba mi się to bardziej niż sprintf pod względem wydajności. Użycie rjustpozwala uniknąć kosztu analizowania ciągu formatu sprintf, konwersji ciągu na liczbę i konwersji tej liczby z powrotem na ciąg. Poza tym (prawdopodobnie) człowiekowi łatwo jest zrozumieć, co próbuje zrobić kod na pierwszy rzut oka.
David Hempy