Jak mogę wydrukować liczbę lub utworzyć ciąg z wypełnieniem zerowym, aby uzyskać stałą szerokość?
Na przykład, jeśli mam numer 12
i chcę to zrobić 000012
.
Jak mogę wydrukować liczbę lub utworzyć ciąg z wypełnieniem zerowym, aby uzyskać stałą szerokość?
Na przykład, jeśli mam numer 12
i chcę to zrobić 000012
.
Odpowiedzi:
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
Sprintf
zamiastPrintf
Użyj Printf
funkcji z pakietu fmt z width
of 6
i znakiem dopełniającym 0
:
import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
Ustawianie width
prac 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 int
parametr:
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 maxVal
w poniższym przykładzie):
myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)
Na koniec, jeśli nie chcesz drukować, stdout
ale zwracać String, użyj Sprintf
również z pakietu fmt z tymi samymi parametrami:
s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
Jest na to jeden najprostszy sposób. Posługiwać się
func padNumberWithZero(value uint32) string {
return fmt.Sprintf("%02d", value)
}
fmt.Sprintf
formatuje i zwraca ciąg bez drukowania go w dowolnym miejscu. Tutaj %02d
mó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:
Możesz użyć %03d
lub więcej, aby uzupełnić więcej zer.
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
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
-
daje tylko spacje, potrzebuję zer.