Ich gebe eine Reihe von nummerierten Dateien aus einem Ruby-Skript aus. Die Zahlen stammen aus dem Inkrementieren eines Zählers, aber damit sie im Verzeichnis gut sortiert werden, möchte ich führende Nullen in den Dateinamen verwenden. Mit anderen Worten
file_001 ...
anstatt
file_1
Gibt es eine einfache Möglichkeit, führende Nullen hinzuzufügen, wenn eine Zahl in eine Zeichenfolge konvertiert wird? (Ich weiß, ich kann "wenn weniger als 10 ... wenn weniger als 100" tun).
%
funktioniert aber ist allgemeiner Zweck.Verwenden Sie den
%
Operator mit einer Zeichenfolge:Die linke Seite ist eine Zeichenfolge im printf-Format, und die rechte Seite kann eine Liste von Werten sein, sodass Sie Folgendes tun können:
Hier ist ein Spickzettel im Printf-Format, den Sie möglicherweise beim Bilden Ihrer Formatzeichenfolge nützlich finden. Das printf-Format stammt ursprünglich aus der
C
Funktionprintf
, aber ähnliche Formatierungsfunktionen sind in Perl, Ruby, Python, Java, PHP usw. verfügbar.quelle
Kernel#sprintf
, das hier dokumentiert ist: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintfsprintf("%03d", 5)
.Können Sie nicht einfach die Zeichenfolgenformatierung des Werts verwenden, bevor Sie den Dateinamen verknüpfen?
quelle
Verwenden Sie
String#next
als Zähler.next
ist relativ "klug", was bedeutet, dass Sie sogar gehen könnenquelle
Wie in den anderen Antworten angegeben,
"%03d" % number
funktioniert es ziemlich gut, aber es widerspricht dem Rubocop Ruby Style Guide :Wir können das gleiche Ergebnis besser lesbar machen, indem wir Folgendes verwenden:
quelle
format
. Wenn Sie Ihren Code leicht verständlich machen möchten, sollten Sie ihn verwendensprintf
, da er Teil der Standard-C-Bibliothek ist. Dieser Name wird in allen Programmiersprachen verwendet. Viel mehr Menschen verstehen, wassprintf
tut, als die Zahl, die wissen, dass diesformat
ein Alias dafür ist. Nur weil etwas Teil von RuboCop ist, ist es nicht von Natur aus richtig oder falsch. Wählen Sie die Regeln aus, die für Ihr Projekt am sinnvollsten sind.'%03d' % number
ist noch einfacher zu lesen."%02d" % num
zusprintf(...)
, dannformat(...)
per RuboCop Vorschlag. Ich entschied dann, dasssprintf
das konventioneller war alsformat
, also aktualisierte rubocop.yml mitStyle/FormatString: EnforcedStyle: sprintf
und jetzt schlafe ich nachts gut.filenames = '000'.upto('100').map { |index| "file_#{index}" }
Ausgänge
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]
quelle