Ich möchte die Postleitzahlen auf fünf Stellen normalisieren, wobei Nullen fehlende Zeichen ersetzen sollen:
%Vor% Ich habe versucht, sprintf wie so sprintf("%05s", zipcode)
zu verwenden und so zu mögen
%Code%. Beide geben falsche Antworten. Verwenden Sie sprintf("%0.5d", zipcode)
:
Dies ist die richtige Anzahl von Zeichen, aber Leerzeichen, keine Nullen.
Verwenden Sie s
:
Was ist die richtige Verwendung von sprintf () in diesem Fall?
Ihre Verwendung von Sprintf ist in Ordnung. Ihr Problem ist, dass 062 (und 0016) oktal ist (genauso wie jede Ganzzahl, die mit einer 0 beginnt), und sie wird 50, wenn sie in base10 konvertiert wird.
Die Lösung besteht darin, diese 0 loszuwerden, bevor sie Ihre Ruby-App erreicht. Angenommen, es handelt sich um eine Zeichenfolge (da Ihre Beispiele Zeichenfolgen enthalten), können Sie Folgendes tun:
%Vor%Und dann weiter mit dem Padding und Druckformatierung.
Der andere Weg ist, wissentlich als Oktal zu drucken, wenn Sie wissen, dass es mit einer 0 beginnt:
%Vor%Wenn Sie die Kontrolle über die Eingabe haben, ist es natürlich am besten, sicherzustellen, dass Benutzer Ihren Code nicht durch Eingabe von Zahlen, die Sie nicht erwarten, unterbrechen können. zB.
%Vor%Das Überprüfen von Eingaben ändert das Problem von einer Formatierung zu einer Validierung, und es ist besser zu verhindern als zu behandeln.
(die schrullige% Syntax ist Zucker für printf
/ sprintf
)
Vielen Dank für Ihre Eingabe. Ich wollte mehr über Sprintf erfahren und speziell Sprintf in der Lösung verwenden, und alle Ideen waren sehr hilfreich. Ich fand schließlich eine kleine Lösung für mein Problem heraus, die flexibel zu sein scheint, und das wurde noch nicht erwähnt, also dachte ich, ich würde es posten.
Wie bereits erwähnt, würde sprintf("%05s", zipcode)
Leerzeichen anstelle von Nullen zurückgeben, wenn eine Zahlenfolge nicht lang genug wäre, aber die richtige Anzahl an Leerzeichen zurückgegeben würde - also kettete ich einfach ein gsub
an das Ende, um das zu ersetzen Leerzeichen mit Nullen.
Bitte lassen Sie mich wissen, wenn es signifikante Probleme mit dieser Lösung gibt. Ich habe es getestet und bisher scheint es zu funktionieren.