Wyprowadzam zestaw plików numerowanych ze skryptu Ruby. Liczby pochodzą z inkrementacji licznika, ale aby ładnie je sortować w katalogu, chciałbym używać początkowych zer w nazwach plików. Innymi słowy
plik_001 ...
zamiast
plik_1
Czy istnieje prosty sposób dodawania zer wiodących podczas konwersji liczby na ciąg? (Wiem, że mogę zrobić „jeśli mniej niż 10 .... jeśli mniej niż 100”).
%
działa, ale ma bardziej ogólny cel.Użyj
%
operatora z ciągiem znaków:Lewa strona to ciąg formatu printf, a prawa strona może być listą wartości, więc możesz zrobić coś takiego:
Oto ściągawka w formacie printf , która może być przydatna w tworzeniu ciągu formatu. Format printf pochodzi pierwotnie z
C
funkcjiprintf
, ale podobne funkcje formatowania są dostępne w Perlu, Ruby, Pythonie, Javie, PHP itp.źródło
Kernel#sprintf
, co jest udokumentowane tutaj: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintfsprintf("%03d", 5)
.Czy nie możesz po prostu sformatować ciągu wartości przed skonkatowaniem nazwy pliku?
źródło
Użyj
String#next
jako licznika.next
jest stosunkowo „sprytny”, co oznacza, że możesz nawet wybraćźródło
Jak stwierdzono w innych odpowiedziach,
"%03d" % number
działa całkiem dobrze, ale jest sprzeczne z przewodnikiem po stylu ruby :Możemy uzyskać ten sam wynik w bardziej czytelny sposób, używając:
źródło
format
. Jeśli Twoim celem jest ułatwienie zrozumienia kodu, powinieneś go użyćsprintf
, ponieważ jest on częścią standardowej biblioteki C. Ta nazwa jest używana w różnych językach programowania. O wiele więcej ludzi rozumie, cosprintf
robi, w porównaniu do liczby, która wie, żeformat
to alias. To, że coś jest częścią RuboCop, nie powoduje, że jest z natury dobre lub złe. Wybierz reguły, które najlepiej pasują do twojego projektu.'%03d' % number
jest jeszcze łatwiejszy do odczytania."%02d" % num
nasprintf(...)
, a następnieformat(...)
według sugestii RuboCop. Uznałem wtedy, że jestsprintf
to bardziej konwencjonalne niżformat
, dlatego zaktualizowałem rubocop.ymlStyle/FormatString: EnforcedStyle: sprintf
i teraz dobrze śpię w nocy.filenames = '000'.upto('100').map { |index| "file_#{index}" }
Wyjścia
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]
źródło