Ruby: Hinzufügen von Nullen zu einer Zahlenfolge mit sprintf ()

8

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

%Vor%

Dies ist die richtige Anzahl von Zeichen, aber Leerzeichen, keine Nullen.

Verwenden Sie s :

%Vor%

Was ist die richtige Verwendung von sprintf () in diesem Fall?

    
VictorO 28.12.2012, 23:43
quelle

6 Antworten

7

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 )

    
mrlee 28.12.2012, 23:58
quelle
24

Quäl dich nicht mit sprintf :

%Vor%     
steenslag 28.12.2012 23:51
quelle
6

Sie möchten% 05d. Auch String #% als Abkürzung:

%Vor%     
pguardiario 29.12.2012 00:05
quelle
2

whirlwins Lösung scheint mir eine gültige (allgemeine padding) Lösung zu sein. Verbessere es einfach mit max:

%Vor%

Um es zu überprüfen:

%Vor%

Max hinzufügen, um mit negativen Werten fertig zu werden:

%Vor%     
BernardK 29.12.2012 09:58
quelle
0

Während dieser Ansatz tatsächlich sprintf nicht verwendet, sollte er Ihr Problem in einer Codezeile lösen:

%Vor%     
whirlwin 28.12.2012 23:51
quelle
0

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.

%Vor%

Bitte lassen Sie mich wissen, wenn es signifikante Probleme mit dieser Lösung gibt. Ich habe es getestet und bisher scheint es zu funktionieren.

    
VictorO 29.12.2012 10:05
quelle

Tags und Links