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) добавлено не было.
Расширенные примеры применения
Генерация последовательных идентификаторов с фиксированной длиной для нумерации файлов или записей в базе данных.
for i in range(1, 12):
print(f'id_{str(i).zfill(3)}.txt')
# Вывод: id_001.txt, id_002.txt, ..., id_011.txtid_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
Подготовка данных для сортировки строк, содержащих числа, в лексикографическом порядке.
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']
Форматирование вывода таблицы с денежными суммами, где знак должен оставаться на месте.
amounts = ['+150', '-20', '+3000', '-5']
for amt in amounts:
print(amt.zfill(8))
# Предполагается общая ширина 8 символов, включая знак+0000150 -0000020 +0003000 -0000005
Использование вместе с методом replace для создания собственного заполнения другими символами. Сначала применяется zfill, затем нули заменяются на нужный символ.
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 будет дополнять всю строку, включая префикс.
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() корректно обрабатывает ведущие знаки, что делает его удобным для форматирования чисел со знаком непосредственно в строковом виде.