Как Pythonic способ дополнить числовую строку нулями слева, т.е. чтобы числовая строка имела определенную длину?
python
string
zero-padding
Николя Жерве
источник
источник
python >= 2.6
неверны. Этот синтаксис не работаетpython >= 3
. Вы можете изменить его наpython < 3
, но могу ли я предложить вместо этого всегда использовать круглые скобки и опускать комментарии вообще (поощряя рекомендуемое использование)?'{:03d} {:03d}'.format(1, 2)
неявно присваивает значения по порядку.print
утверждение, когда оно должно бытьprint
функцией на Python 3? Я редактировал в Parens; поскольку печатается только одна вещь, теперь она работает одинаково на Py2 и Py3.Просто используйте метод rjust строкового объекта.
В этом примере будет сделана строка длиной 10 символов, дополненная по необходимости.
источник
Кроме того
zfill
, вы можете использовать общее форматирование строки:Документация для форматирования строк и f-строк .
источник
format
вместо этого нужно использовать , и люди обычно интерпретируют это как намерение осудить.Для Python 3.6+ с использованием f-строк:
Для Python 2 до Python 3.5:
источник
если хочешь наоборот:
источник
str(n).zfill(width)
будет работать сstring
s,int
s,float
s ... и совместим с Python 2. x и 3. x :источник
Для тех, кто пришел сюда, чтобы понять, а не просто быстрый ответ. Я делаю это специально для временных строк:
источник
str.zfill
специально предназначен для этого:Обратите внимание, что он специально предназначен для обработки числовых строк по запросу и перемещает a
+
или-
в начало строки:Вот помощь по
str.zfill
:Представление
Это также самый эффективный из альтернативных методов:
Чтобы лучше сравнить яблоки с яблоками по
%
методу (обратите внимание, что это на самом деле медленнее), который в противном случае будет предварительно рассчитать:Реализация
Немного покопавшись, я нашел реализацию
zfill
метода вObjects/stringlib/transmogrify.h
:Давайте пройдемся по этому C-коду.
Сначала он анализирует аргумент позиционно, то есть он не допускает аргументы с ключевыми словами:
Затем он проверяет, имеет ли он ту же длину или больше, и в этом случае он возвращает строку.
zfill
вызововpad
(этаpad
функция также вызываетсяljust
,rjust
иcenter
а). Это в основном копирует содержимое в новую строку и заполняет отступы.После вызова
pad
,zfill
движется любой первоначально предшествующее+
или-
в начале строки.Обратите внимание, что для того, чтобы исходная строка была фактически числовой, не требуется:
источник
+
и-
, и я добавил ссылку на документы!Смотрите печатную документацию для всех интересных деталей!
Обновление для Python 3.x (7,5 лет спустя)
Эта последняя строка должна теперь быть:
Т.е.
print()
теперь это функция, а не утверждение. Обратите внимание, что я все еще предпочитаюprintf()
стиль старой школы, потому что, IMNSHO, он читается лучше, и потому что я использую эту запись с января 1980 года. Что-то ... старые собаки ... что-то ... что-то новое ...источник
"%0*d" % (width, x)
интерпретируется Python?При использовании Python
>= 3.6
самый простой способ - использовать f-строки с форматированием строк :Я бы предпочел форматирование с
int
, так как только тогда знак обрабатывается правильно:источник
Для почтовых индексов, сохраняемых как целые числа:
источник
Быстрое сравнение сроков:
Я сделал разные тесты разных повторений. Различия невелики, но во всех тестах
zfill
решение было самым быстрым.источник
Другой подход заключается в использовании списочного понимания с проверкой условий на длину. Ниже приведена демонстрация:
источник
Это тоже хорошо:
поэтому вывод будет: «02:07:03»
источник
Вы также можете повторить «0», добавить его
str(n)
и получить самый правый срез ширины. Быстрое и грязное маленькое выражение.источник