Golang: Jak wpisać cyfrę zerami podczas drukowania?

108

Jak mogę wydrukować liczbę lub utworzyć ciąg z wypełnieniem zerowym, aby uzyskać stałą szerokość?

Na przykład, jeśli mam numer 12i chcę to zrobić 000012.

Travis Reeder
źródło

Odpowiedzi:

183

Pakiet fmt może zrobić to za Ciebie:

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

Zwróć uwagę na 0 w% 06d, które sprawi, że będzie miał szerokość 6 i dopełni je zerami. Drugi będzie wypełniony spacjami.

Możesz zobaczyć to w akcji tutaj: http://play.golang.org/p/cinDspMccp

Travis Reeder
źródło
2
A jeśli chcę, aby podkładka znajdowała się po prawej stronie? użycie flagi -daje tylko spacje, potrzebuję zer.
majidarif
5
Jeśli chcesz, aby łańcuch do późniejszej pracy, użyj SprintfzamiastPrintf
oliverpool
48

Użyj Printffunkcji z pakietu fmt z widthof 6i znakiem dopełniającym 0:

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

Ustawianie widthprac przez umieszczenie liczby całkowitej bezpośrednio poprzedzającej specyfikator formatu („czasownik”):

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'

Jedynymi znakami dopełnienia obsługiwanymi przez Golang (i większość innych języków) są spacje i 0:

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

Możliwe jest wyrównanie wydruku do prawej, dodając minus -:

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

Uważaj, w przypadku liczb zmiennoprzecinkowych szerokość obejmuje cały ciąg formatu:

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

Warto zauważyć, że szerokość można również ustawić programowo, używając *zamiast liczby i przekazując szerokość jako intparametr:

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

Może to być przydatne na przykład, jeśli największa wartość, którą chcesz wydrukować, jest znana tylko w czasie wykonywania (wywoływana maxValw poniższym przykładzie):

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

Na koniec, jeśli nie chcesz drukować, stdoutale zwracać String, użyj Sprintfrównież z pakietu fmt z tymi samymi parametrami:

s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
Christopher Oezbek
źródło
30

Jest na to jeden najprostszy sposób. Posługiwać się

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

fmt.Sprintfformatuje i zwraca ciąg bez drukowania go w dowolnym miejscu. Tutaj %02dmówi, że pad zero po lewej stronie dla wartości, która ma <2 liczby cyfr. Jeśli podana wartość ma 2 lub więcej cyfr, nie będzie dopełniana. Na przykład:

  • Jeśli wejście ma wartość 1, wyjście będzie miało wartość 01.
  • Jeśli na wejściu jest 12, na wyjściu będzie 12.
  • Jeśli wejście to 1992, wynik będzie 1992.

Możesz użyć %03dlub więcej, aby uzupełnić więcej zer.

Jai Prak
źródło
11

Pytanie " Lista formatów drukowania w Go lang " przypomina nam, że jest też flaga:

- wypełnienie ze spacjami po prawej, a nie lewej stronie (wyrównanie pola do lewej)


Możesz zobaczyć więcej przykładów dopełnienia za pomocą DaddyOh/golang-samples/pad.go, jeśli chcesz dopełnić innymi sekwencjami ciągów (bardziej złożonymi niż „ 0” lub „ ”):

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

Zobacz 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
źródło
Eric Palmer usunął swoje repozytorium z samplami golang, więc link już nie działa.
Konstantin Azizov
1
@KonstantinAzizov Słuszna uwaga. Przywróciłem ten link. Raczej.
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) wynik: "03"

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

keyzi
źródło
0

Dla tych, którzy chcą mieć odpowiednią podkładkę, możesz to zrobić:

str2pad := "12"
padWith := "0"
amt2pad := 6

//This will make sure there is always 6 characters total, padded on the right side
//Note to check if strings.Repeat returns a negative value
paddedStr := str2pad + strings.Repeat(padWith, amt2pad - len(str2pad))

//Outputs 120000
Indukcja
źródło