Zfill: примеры (PYTHON)

Работа с функцией zfill для форматирования строк в Python
Раздел: Строки, Модификация строк
zfill(width): str

Основные сведения о методе zfill

Метод zfill() является строковым методом в Python, предназначенным для заполнения строки нулями слева. Основное применение - форматирование числовых строк для выравнивания по разрядности или подготовки данных с фиксированной длиной.

Синтаксис метода: str.zfill(width), где str - исходная строка, к которой применяется метод.

Единственный аргумент width определяет итоговую длину строки после заполнения. Это целое положительное число. Если указанная ширина меньше или равна длине исходной строки, метод возвращает копию исходной строки без изменений.

Особенность метода - обработка ведущих знаков '+' или '-'. Символ знака считается частью строки, и заполнение нулями происходит после него, сохраняя знак в начале результата.

Метод возвращает новую строку, исходная строка остается неизменной, так как строки в Python неизменяемы.

Простые примеры использования

Базовый пример заполнения числовой строки:

num = '42'
print(num.zfill(5))
00042

Работа со строкой, длина которой превышает заданную ширину:

num = '12345'
print(num.zfill(3))
12345

Обработка строки с отрицательным знаком:

num = '-17'
print(num.zfill(6))
-00017

Обработка строки с положительным знаком:

num = '+8'
print(num.zfill(4))
+008

Применение к нечисловой строке:

text = 'ABC'
print(text.zfill(7))
0000ABC

Похожие методы в Python

В Python существуют другие способы достижения сходного результата.

str.rjust(width[, fillchar]) - выравнивает строку по правому краю, заполняя указанным символом слева. По умолчанию fillchar - пробел. В отличие от zfill, позволяет выбрать любой символ для заполнения, а не только ноль.

str.format() и f-строки - предлагают мощные возможности форматирования. Для дополнения нулями можно использовать спецификаторы формата, например: f'{число:0{ширина}}' или '{:0>width}'.format(строка). Эти методы предпочтительнее для сложного форматирования или когда нужно явно указать тип данных.

zfill() выбирают за его простоту и ясность, когда требуется именно заполнение нулями слева для строкового представления числа, особенно при работе с уже имеющимися строками.

Возможные ошибки и нюансы

Передача нестрокового объекта приводит к ошибке AttributeError, так как метод определен только для строк.

num = 42
print(num.zfill(5))
AttributeError: 'int' object has no attribute 'zfill'

Сначала необходимо преобразовать число в строку: str(num).zfill(5).

Ожидание дополнения нулями справа. Метод zfill добавляет нули только слева.

print('42'.zfill(5))
00042 # Результат '42000' получить нельзя

Отрицательное значение width не вызывает ошибки, но возвращает исходную строку.

print('test'.zfill(-2))
test

Работа с плавающей точкой требует предварительного преобразования в строку и, возможно, раздельной обработки целой и дробной частей.

Изменения в различных версиях Python

Поведение метода str.zfill() остается стабильным и неизменным на протяжении многих версий Python 3. В Python 2 метод также присутствовал с аналогичной семантикой. Основные изменения связаны с развитием строк как объектов (переход на Unicode в Python 3) и не затрагивают логику работы самого метода.

Новых аргументов или флагов в последних версиях Python (3.8, 3.9, 3.10, 3.11, 3.12) добавлено не было.

Расширенные примеры применения

Генерация последовательных идентификаторов с фиксированной длиной для нумерации файлов или записей в базе данных.

Пример python
for i in range(1, 12):
    print(f'id_{str(i).zfill(3)}.txt')
# Вывод: id_001.txt, id_002.txt, ..., id_011.txt
id_001.txt
id_002.txt
id_003.txt
id_004.txt
id_005.txt
id_006.txt
id_007.txt
id_008.txt
id_009.txt
id_010.txt
id_011.txt

Подготовка данных для сортировки строк, содержащих числа, в лексикографическом порядке.

Пример python
files = ['9.log', '10.log', '1.log', '100.log']
sorted_files = sorted(files, key=lambda x: x.split('.')[0].zfill(10))
print(sorted_files)
['1.log', '9.log', '10.log', '100.log']

Форматирование вывода таблицы с денежными суммами, где знак должен оставаться на месте.

Пример python
amounts = ['+150', '-20', '+3000', '-5']
for amt in amounts:
    print(amt.zfill(8))
# Предполагается общая ширина 8 символов, включая знак
+0000150
-0000020
+0003000
-0000005

Использование вместе с методом replace для создания собственного заполнения другими символами. Сначала применяется zfill, затем нули заменяются на нужный символ.

Пример python
def custom_fill(s, width, char):
    return s.zfill(width).replace('0', char, width - len(s))

print(custom_fill('7', 5, '*'))
****7

Обработка шестнадцатеричных или двоичных строк, полученных через bin() или hex(), которые имеют префиксы '0b' и '0x'. zfill будет дополнять всю строку, включая префикс.

Пример python
hex_num = hex(15)[2:]  # 'f'
print(hex_num.zfill(4))

bin_num = bin(5)[2:]  # '101'
print(bin_num.zfill(8))
000f
00000101

Аналоги в других языках программирования

PHP: Функция str_pad() с флагом STR_PAD_LEFT.

echo str_pad('42', 5, '0', STR_PAD_LEFT);
00042

JavaScript: Метод padStart() для строк.

console.log('42'.padStart(5, '0'));
00042

Java: Метод String.format() с спецификатором %0xd для целых чисел или StringUtils.leftPad() из Apache Commons.

String result = String.format('%05d', 42);
System.out.println(result);
00042

SQL (MySQL): Функция LPAD().

SELECT LPAD('42', 5, '0');
00042

C#: Метод ToString() с форматом или PadLeft().

Console.WriteLine(42.ToString('D5'));
Console.WriteLine('42'.PadLeft(5, '0'));
00042
00042

Lua: Прямого аналога нет, часто используют цикл или функцию string.rep для конкатенации.

Golang: Используется функция fmt.Sprintf() с шаблоном.

result := fmt.Sprintf('%05s', '42')
fmt.Println(result)
00042

Kotlin: Метод-расширение padStart().

println('42'.padStart(5, '0'))
00042

Отличие Python в том, что zfill() корректно обрабатывает ведущие знаки, что делает его удобным для форматирования чисел со знаком непосредственно в строковом виде.

питон zfill function comments

En
Zfill Pad with zeros