2009-10-09 13 views
182

Wysyłam zestaw ponumerowanych plików ze skryptu Ruby. Liczby pochodzą z inkrementacji licznika, ale aby ładnie je sortować w katalogu, chciałbym użyć wiodących zer w nazwach plików. Innymi słowyJak mogę wyprowadzić wiodące zera w Ruby?

file_001 ...

zamiast

file_1

Czy istnieje prosty sposób dodać zera na początku numeru podczas konwersji do ciąg znaków? (Wiem, że mogę zrobić "jeśli mniej niż 10 ... jeśli mniej niż 100").

Odpowiedz

212

Jeżeli maksymalna liczba cyfr w liczniku są znane (na przykład n = 3 dla liczników 1..876), można wykonać

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

Heh heh, nie jest najlepszą odpowiedzią, ale nie wiedziałem o rym i od lat używam rubinu. Twoje zdrowie! – pauliephonic

+0

Muszę zagłosować, ponieważ wydaje się, że% 03s klocki ze spacjami z jakiegoś dziwnego powodu (% 03d wydaje się działać dobrze). Mógłbym przysiąc, że C wypełniłby się zerami w obu przypadkach. – Nerdmaster

+0

Ostatecznie zmieniono to na akceptowalną odpowiedź, ponieważ jest najprostsza i najłatwiejsza do zapamiętania. '%' działa, ale jest bardziej ogólny. –

296

użyć operatora % sznurkiem:

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

Lewą ręką-side jest ciąg formatu printf, a po prawej stronie może być listą wartości, więc można zrobić coś takiego :

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

Oto printf format cheat sheet może się okazać przydatne w tworzeniu swój ciąg formatu. Format printf pochodzi z C funkcji printf, ale podobne funkcje formatowania dostępne są w Perl, Ruby, Python, Java, PHP, itd

+1

Great! Zatem "% s" oznacza "zastąpić N-tą tutaj wartość", a "% 03d" oznacza "zastąpić tutaj liczbę, dodając tyle zer, ile potrzeba, aby była to 3-cyfrowa liczba?" (Zgaduję, że d oznacza "cyfry".) Teraz widzę dokumentację na ten temat (http://www.ruby-doc.org/core/classes/String.html#M000770), ale jest to bardzo zwięzłe i Chciałbym trochę rozwinąć. –

+1

Dodałem link do arkusza oszukańczego w formacie printf. "s" oznacza "ciąg", "d" oznacza "liczbę dziesiętną". "03", oznacza "pad do 3 znaków z zerami"; "% 3d" padłoby po lewej stronie ze spacjami. –

+0

Świetnie! Dzięki za pomocne wyjaśnienie. –

38

Nie można po prostu użyć string formatting wartości przed Concat nazwę pliku?

"%03d" % number 
+0

Myślę, że ta odpowiedź nie dodaje niczego do odpowiedzi @Daniel Marcina, jednak lubię swoją prostotę ... – SsouLlesS

+1

on odpowiedział w tej samej chwili, jak Daniel Martin tak był prawdopodobnie nieświadomy powielania. –

+0

Świat jest niesprawiedliwy. – Santhosh

20

Zastosowanie String#next jako licznik.

>> n = "000" 
>> 3.times { puts "file_#{n.next!}" } 
file_001 
file_002 
file_003 
Powiązane problemy