Как заполнить строку символом n, чтобы сделать ее определенной длины в Python - PullRequest
2 голосов
/ 04 марта 2020

Мне трудно найти точную формулировку для моего вопроса, так как я новичок в форматировании строк.

Допустим, у меня есть две переменные:

customer = 'John Doe'
balance = 39.99

Я хочу напечатать строку шириной 25 символов и заполнить пространство между двумя значениями указанным c символом (в в данном случае, периоды):

'John Doe .......... 39.99'

Чтобы я через клиентов oop хотел напечатать строку, которая всегда состоит из 25 символов, с их именем слева и балансом справа и позволяют периодам корректироваться, чтобы заполнить пространство между.

Я могу разбить это на несколько шагов и получить sh результат ...

customer = 'Barry Allen'
balance = 99
spaces = 23 - len(customer + str(balance))
'{} {} {}'.format(customer, '.' * spaces, balance)

# of course, this assumes that len(customer + str(balance)) is less than 23 (which is easy to work around)

... но я Мне любопытно, если есть более «элегантный» способ сделать это, например, с форматированием строки.

Возможно ли это вообще?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 04 марта 2020

Вы можете использовать ljust() и rjust() строковых объектов в python:

customer = 'John Doe'
balance = 39.99

output = customer.ljust(15, '.') + str(balance).rjust(10, '.')

print(output)
#John Doe............39.99

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

1 голос
/ 04 марта 2020

Если вы не хотите, чтобы по обе стороны от точек были пробелы, как подсказывает другой ответ, вы можете добиться того, чтобы указав форматирование также:

"{:.<17s}{:.>8.2f}".format(customer, balance)

Выравнивание по ширине в 17 символов по левому краю, . по правому краю и по 8 по правому краю, . по левому краю, с плавающей запятой с точностью до 2 десятичных знаков.

Вы можете сделать то же самое с помощью f-строки (Python> = 3.6):

f"{customer:.<17s}{balance:.>8.2f}"

Однако, если вы также хотите включить пробел по обе стороны от точек, будет сложнее. Вы все еще можете это сделать, но вам нужно дважды заполнить / отформатировать или объединить, прежде чем заполнять пробел:

"{:.<16s}{:.>9s}".format(f"{customer} ", f" {balance:>.2f}")

Но мне было бы несколько больно называть это более элегантным.

Вы также можете сделать все это с помощью форматирования:

# Fill in with calculated number of "."
"{} {} {:.2f}".format(customer,
                      "."*(25 - (2 + len(customer) + len(f"{balance:.2f}"))),
                      balance)
# Similarly used for calculated width to pad with "."
"{} {:.^{}s} {:.2f}".format(customer,
                            "",
                            25 - (2 + len(customer) + len(f"{balance:.2f}")),
                            balance)

Но, опять же, элегантнее, на самом деле это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...