Как вывести число с ведущими нулями при печати в Go?
Использование пакета fmt с шириной и флагом заполнения нулями
В Go для форматированного вывода чисел с ведущими нулями используется пакет fmt и его функция Printf (или Sprintf для получения строки). Основной инструмент — спецификатор формата %0Xd, где X — общая ширина поля (включая все цифры), а 0 — флаг, указывающий на заполнение нулями слева.
Вот как это работает для вашего примера:
package main
import "fmt"
func main() {
num := 7
fmt.Printf("Результат: %04d\n", num) // Выведет: Результат: 0007
num2 := 123
fmt.Printf("Результат: %04d\n", num2) // Выведет: Результат: 0123
num3 := 9999
fmt.Printf("Результат: %04d\n", num3) // Выведет: Результат: 9999
}
Разбор спецификатора %04d
%— начало спецификатора формата0— флаг "заполнять нулями" (zero padding)4— минимальная ширина поля (количество символов)d— тип данных (decimal — десятичное целое число)
Если число занимает меньше места, чем указанная ширина, свободные позиции слева заполняются нулями. Если число длиннее ширины, ширина игнорируется — число выводится полностью.
Как получить строку, а не вывести в консоль
Если нужно сохранить результат в переменной, используйте fmt.Sprintf:
package main
import "fmt"
func main() {
num := 7
padded := fmt.Sprintf("%04d", num)
fmt.Println(padded) // Выведет: 0007
}
Работа с разной шириной
Вы можете задать любую ширину динамически:
package main
import "fmt"
func main() {
width := 6
num := 42
// Используем ширину из переменной
result := fmt.Sprintf("%0*d", width, num)
fmt.Println(result) // Выведет: 000042
}
Важные замечания
- Флаг
0работает только с целыми числами (%d) и числами с плавающей точкой (%f,%g). - Если число отрицательное, знак минус выводится перед нулями:
fmt.Sprintf("%05d", -7)даст"-0007". - Для шестнадцатеричных чисел используйте
%04xили%04X. - Не путайте с
%4d(без нуля) — это выравнивание пробелами справа.
Это стандартный и самый простой способ в Go. Пакет fmt — мощный инструмент, рекомендую изучить его документацию: https://pkg.go.dev/fmt.
Альтернатива: пакет strconv с ручным дополнением
Если по какой-то причине вы не хотите использовать fmt.Sprintf (например, в критичном по производительности коде или в среде с ограниченными ресурсами), можно реализовать дополнение нулями вручную через пакет strconv:
package main
import (
"fmt"
"strconv"
"strings"
)
func padWithZeros(num, width int) string {
str := strconv.Itoa(num)
if len(str) >= width {
return str
}
return strings.Repeat("0", width-len(str)) + str
}
func main() {
fmt.Println(padWithZeros(7, 4)) // 0007
fmt.Println(padWithZeros(123, 4)) // 0123
fmt.Println(padWithZeros(9999, 4)) // 9999
}
Когда это может быть полезно
- Если нужно избежать зависимости от пакета
fmt(редко, но бывает). - Если вы уже используете
strconvдля других операций и хотите сохранить единообразие. - Для учебных целей — чтобы понять, как работают строковые операции.
Однако на практике fmt.Sprintf("%04d", num) предпочтительнее: код короче, понятнее и не требует дополнительных функций. Пакет fmt оптимизирован и вряд ли станет узким местом производительности.
Ответов пока нет.
Войдите чтобы оставить ответ