Как я могу напечатать номер или сделать строку с нулевым заполнением, чтобы сделать ее фиксированной?
Например, если у меня есть номер 12
, и я хочу сделать его 000012
.
Как я могу напечатать номер или сделать строку с нулевым заполнением, чтобы сделать ее фиксированной?
Например, если у меня есть номер 12
, и я хочу сделать его 000012
.
Пакет fmt может сделать это для вас:
fmt.Printf("|%06d|%6d|\n", 12, 345)
Обратите внимание на 0 в% 06d, что сделает его шириной 6 и положит его нулями. Второй будет заполняться пробелами.
Вы можете увидеть это в действии здесь: http://play.golang.org/p/cinDspMccp
Есть один самый простой способ добиться этого. использование
func padNumberWithZero(value uint32) string {
return fmt.Sprintf("%02d", value)
}
fmt.Sprintf
форматирует и возвращает строку, нигде не печатая. Здесь %02d
говорит, что нулевое %02d
слева для значения, у которого <2 числа цифр. Если данное значение имеет 2 или более цифр, оно не будет дополнено. Например:
Вы можете использовать %03d
или больше для дополнительного заполнения нулями.
Используйте функцию Printf
из пакета fmt с width
из 6
и символом заполнения 0
:
import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
Настройка width
работает следующим образом:
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'
Единственными символами заполнения, поддерживаемыми Golang (и большинством других языков), являются пробелы и 0
:
fmt.Printf("%6d", 12) // Default padding is spaces, prints ' 12'
fmt.Printf("%06d", 12) // Change to 0 padding, prints '000012'
Можно выровнять печать по правому краю, добавив минус -
:
fmt.Printf("%-6d", 12) // Padding right-justified, prints '12 '
Помните, что для чисел с плавающей точкой ширина включает всю строку формата:
fmt.Printf("%6.1f", 12.0) // Prints '0012.0' (width is 6, precision is 1 digit)
Полезно отметить, что ширина также может быть установлена программно с помощью *
вместо числа и передачи ширины в качестве параметра int
:
myWidth := 6
fmt.Printf("%0*d", myWidth, 12) // Prints '000012' as before
Это может быть полезно, например, если наибольшее значение, которое вы хотите напечатать, известно только во время выполнения (в следующем примере это называется maxVal
):
myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)
Наконец, если вы не хотите печатать в stdout
, но возвращаете строку, используйте Sprintf
также из пакета fmt с такими же параметрами:
s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
Вопрос "Список формата печати в Go lang" напоминает нам, что есть также флаг:
-
панель с пробелами справа, а не слева (выравнивание по левому краю поля)
Вы можете увидеть больше примеров дополнений с DaddyOh/golang-samples/pad.go
, если вы хотите использовать другие последовательности строк (более сложные, чем '0
'или' '):
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)
См. 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
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) результат: "03"
lpad ( "12", "0", 6): "000012"