Wie kann ich führende Nullen in Ruby ausgeben?

238

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).

Nathan Long
quelle

Antworten:

281

Wenn die maximale Anzahl von Ziffern im Zähler bekannt ist (z. B. n = 3 für Zähler 1..876), können Sie dies tun

str = "file_" + i.to_s.rjust(n, "0")
alex.zherdev
quelle
8
Heh heh, nicht die beste Antwort, aber ich wusste nichts über Recht und ich benutze seit Jahren Rubin. Prost!
Pauliephonic
Ich muss das abstimmen, weil es den Anschein hat, dass% 03s aus irgendeinem Grund Leerzeichen enthalten (% 03d scheint gut zu funktionieren). Ich hätte schwören können, dass C in beiden Fällen mit Nullen aufgefüllt war.
Nerdmaster
Schließlich wurde dies auf die akzeptierte Antwort umgestellt, da es am einfachsten und am einfachsten zu merken ist. %funktioniert aber ist allgemeiner Zweck.
Nathan Long
unerwartet aber am einfachsten
akostadinov
1
Kam hierher, um zu erfahren, wie man eine Basis-36-Nummer auffüllt. Dies funktioniert dafür, während% so aussieht, als würde es nicht so sein. Vielen Dank!
Ethan Kaminski
344

Verwenden Sie den %Operator mit einer Zeichenfolge:

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

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:

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

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 CFunktion printf, aber ähnliche Formatierungsfunktionen sind in Perl, Ruby, Python, Java, PHP usw. verfügbar.

Daniel Martin
quelle
1
Toll! "% S" bedeutet also "hier den N-ten Wert ersetzen" und "% 03d" bedeutet "hier eine Zahl ersetzen und so viele Nullen hinzufügen, wie nötig, um daraus eine dreistellige Zahl zu machen?" (Ich vermute, das d bedeutet "Ziffern".) Ich sehe jetzt die Dokumentation dazu ( ruby-doc.org/core/classes/String.html#M000770 ), aber es ist sehr prägnant und ich möchte eine kleine Ausarbeitung .
Nathan Long
1
Ich habe einen Link zu einem Spickzettel im Printf-Format hinzugefügt. "s" bedeutet "Zeichenfolge", "d" bedeutet "Dezimalzahl". Das "03" bedeutet "Pad auf 3 Zeichen mit Nullen"; "% 3d" würde links mit Leerzeichen auffüllen.
Daniel Martin
2
Übrigens - dies ist dasselbe wie das Aufrufen Kernel#sprintf, das hier dokumentiert ist: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf
Nathan Long
Wenn Sie den Kommentar von @ NathanLong ergänzen, wird das erste Beispiel in dieser Antwort als geschrieben sprintf("%03d", 5).
Dennis
Dies sollte die ausgewählte Antwort sein.
Dan Barron
50

Können Sie nicht einfach die Zeichenfolgenformatierung des Werts verwenden, bevor Sie den Dateinamen verknüpfen?

"%03d" % number
Ólafur Waage
quelle
Ich denke, diese Antwort fügt der Antwort von @Daniel Martin nichts hinzu, aber ich mag ihre Einfachheit ...
svelandiag
3
Er antwortete in derselben Minute wie Daniel Martin und war sich der Verdoppelung wahrscheinlich nicht bewusst.
Kurt Peek
Dies ist perfekt für utc_offset
Abel
30

Verwenden Sie String#nextals Zähler.

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

next ist relativ "klug", was bedeutet, dass Sie sogar gehen können

>> n = "file_000"
>> 3.times { puts n.next! }
file_001
file_002
file_003
testr
quelle
Vielen Dank für den Hinweis. Das ist so eine tolle Methode.
Weston Ganger
9

Wie in den anderen Antworten angegeben, "%03d" % numberfunktioniert es ziemlich gut, aber es widerspricht dem Rubocop Ruby Style Guide :

Bevorzugen Sie die Verwendung von sprintf und seines Alias-Formats gegenüber der ziemlich kryptischen String #% -Methode

Wir können das gleiche Ergebnis besser lesbar machen, indem wir Folgendes verwenden:

format('%03d', number)
Rodrigo Vasconcelos
quelle
1
Wenn Sie eine obskure Ruby-Sprachfunktion erlernen möchten, verwenden Sie den Alias format. Wenn Sie Ihren Code leicht verständlich machen möchten, sollten Sie ihn verwenden sprintf, da er Teil der Standard-C-Bibliothek ist. Dieser Name wird in allen Programmiersprachen verwendet. Viel mehr Menschen verstehen, was sprintftut, als die Zahl, die wissen, dass dies formatein 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' % numberist noch einfacher zu lesen.
Tilo
1
Ich ging durch diese gleiche Schleife, Wechsel "%02d" % numzu sprintf(...), dann format(...)per RuboCop Vorschlag. Ich entschied dann, dass sprintfdas konventioneller war als format, also aktualisierte rubocop.yml mit Style/FormatString: EnforcedStyle: sprintfund jetzt schlafe ich nachts gut.
David Hempy
1

filenames = '000'.upto('100').map { |index| "file_#{index}" }

Ausgänge

[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]

Ivan
quelle