Golang: Wie kann man beim Drucken eine Zahl mit Nullen auffüllen?

98

Wie kann ich eine Zahl drucken oder eine Zeichenfolge ohne Auffüllen erstellen, um eine feste Breite zu erzielen?

Zum Beispiel, wenn ich die Nummer habe 12und sie machen möchte 000012.

Travis Reeder
quelle

Antworten:

175

Das fmt-Paket kann dies für Sie tun:

fmt.Printf("|%06d|%6d|\n", 12, 345)

Beachten Sie die 0 in% 06d, die eine Breite von 6 ergibt, und füllen Sie sie mit Nullen auf. Der zweite wird mit Leerzeichen aufgefüllt.

Sie können es hier in Aktion sehen: http://play.golang.org/p/cinDspMccp

Travis Reeder
quelle
2
Was ist, wenn das Pad rechts sein soll? Wenn -ich das Flag benutze, gibt es nur Leerzeichen, ich brauche Nullen.
Majidarif
5
Wenn Sie möchten, dass eine Zeichenfolge später verwendet wird, verwenden Sie Sprintfanstelle vonPrintf
oliverpool
42

Verwenden Sie die PrintfFunktion aus dem fmt-Paket mit einem widthvon 6und dem Füllzeichen 0:

import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'

Festlegen der widthWerke durch Setzen einer Ganzzahl direkt vor dem Formatbezeichner ('Verb'):

fmt.Printf("%d", 12)   // Uses default width,                          prints '12'
fmt.Printf("%6d", 12)  // Uses a width of 6 and left pads with spaces, prints '    12'

Die einzigen von Golang (und den meisten anderen Sprachen) unterstützten Füllzeichen sind Leerzeichen und 0 :

fmt.Printf("%6d", 12)   // Default padding is spaces, prints '    12'
fmt.Printf("%06d", 12)  // Change to 0 padding,       prints '000012'

Es ist möglich, den Druck durch Voranstellen eines Minus richtig zu begründen - :

fmt.Printf("%-6d", 12)   // Padding right-justified, prints '12    '

Beachten Sie, dass bei Gleitkommazahlen die Breite die gesamte Formatzeichenfolge enthält:

fmt.Printf("%6.1f", 12.0) // Prints '0012.0' (width is 6, precision is 1 digit)

Es ist nützlich zu beachten, dass die Breite auch programmgesteuert eingestellt werden kann, indem *anstelle einer Zahl die Breite als intParameter übergeben wird:

myWidth := 6
fmt.Printf("%0*d", myWidth, 12) // Prints '000012' as before

Dies kann beispielsweise nützlich sein, wenn der größte Wert, den Sie drucken möchten, nur zur Laufzeit bekannt ist ( maxValim folgenden Beispiel aufgerufen ):

myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)

Wenn Sie nicht drucken möchten, stdoutsondern einen String zurückgeben möchten , verwenden Sie Sprintfauch das Paket fmt mit denselben Parametern:

s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
Christopher Oezbek
quelle
29

Es gibt einen einfachsten Weg, dies zu erreichen. Verwenden

func padNumberWithZero(value uint32) string {
    return fmt.Sprintf("%02d", value)
}

fmt.Sprintfformatiert und gibt eine Zeichenfolge zurück, ohne sie irgendwo zu drucken. Hier %02dsteht links Pad Null für einen Wert mit <2 Ziffern. Wenn der angegebene Wert 2 oder mehr Ziffern hat, wird er nicht aufgefüllt. Beispielsweise:

  • Wenn der Eingang 1 ist, ist der Ausgang 01.
  • Wenn der Eingang 12 ist, ist der Ausgang 12.
  • Wenn die Eingabe 1992 ist, ist die Ausgabe 1992.

Sie können %03doder mehr für mehr Nullen verwenden.

Jai Prak
quelle
10

Die Frage " Liste der Druckformate in Go lang " erinnert uns daran, dass es auch die Flagge gibt:

- Pad mit Leerzeichen rechts und nicht links (linksbündig das Feld)


Sie können weitere Auffüllbeispiele mit sehen DaddyOh/golang-samples/pad.go, wenn Sie mit anderen Zeichenfolgenfolgen auffüllen möchten (komplexer als ' 0' oder ' '):

  • leftPad(s string, padStr string, pLen int)
  • rightPad(s string, padStr string, pLen int)
  • leftPad2Len(s string, padStr string, overallLen int)
  • rightPad2Len(s string, padStr string, overallLen int)

Siehe play.golang.org:

1234567890

leftPad(str, "*", 3)  ***1234567890
leftPad2Len(str, "*-", 13)  -*-1234567890
leftPad2Len(str, "*-", 14)  *-*-1234567890
leftPad2Len(str, "*", 14)  ****1234567890
leftPad2Len(str, "*-x", 14)  x*-x1234567890
leftPad2Len(str, "ABCDE", 14)  BCDE1234567890
leftPad2Len(str, "ABCDE", 4)  7890
rightPad(str, "*", 3)  1234567890***
rightPad(str, "*!", 3)  1234567890*!*!*!
rightPad2Len(str, "*-", 13)  1234567890*-*
rightPad2Len(str, "*-", 14)  1234567890*-*-
rightPad2Len(str, "*", 14)  1234567890****
rightPad2Len(str, "*-x", 14)  1234567890*-x*
rightPad2Len(str, "ABCDE", 14)  1234567890ABCD
rightPad2Len(str, "ABCDE", 4)  1234
VonC
quelle
Eric Palmer hat sein Repo mit Golang-Samples entfernt, sodass der Link nicht mehr funktioniert.
Konstantin Azizov
1
@KonstantinAzizov Guter Punkt. Ich habe diesen Link wiederhergestellt. Art von.
VonC
3
func lpad(s string,pad string, plength int)string{
    for i:=len(s);i<plength;i++{
        s=pad+s
    }
    return s
}

lpad ("3", "0", 2) Ergebnis: "03"

lpad ("12", "0", 6) Ergebnis: "000012"

keyzi
quelle