Форматирование текста, которое должно быть обосновано в Python 3.3 с помощью метода .format()
Я новичок в Python и пытаюсь работать над некоторыми примерами скриптов. Я делаю простую операцию типа кассового регистра, но я хочу оправдать или правильно выровнять вывод так, чтобы он выглядел примерно так:
subTotal = 24.95
tax = subTotal * 0.0725
total = subTotal + tax
paid = 30
change = paid-total
print("The subtotal was: $",subTotal)
print("The tax was: $",tax)
print("The total was: $",total)
print("The customer paid: $",paid)
print("Change due: $",change)
Я знаю, что я мог бы упростить это с гораздо меньшими операциями печати, но я просто хотел, чтобы было легче увидеть, что я пытаюсь сделать.
Я хочу, чтобы он выводил что-то вроде этого, обратите внимание, что суммы в долларах выровнены и что между суммой $и долларом нет места. Я не знаю, как это сделать.
The subtotal was: $24.95
The tax was: $1.81
The total was: $26.76
The customer paid: $30.00
Change due: $3.24
Я пробовал читать документы Python для метода format, но я не видел примеров того, какие спецификаторы формата могут использоваться для выполнения определенных задач. Заранее благодарим за любую помощь.
Ответы
Ответ 1
Сумма может быть сформирована следующим образом:
"${:.2f}".format(amount)
Вы можете добавить дополнение к строке, например, для ширины 20:
"{:20s}".format(mystring)
Вы можете правильно выровнять строку, например, с шириной 7:
"{:>7s}".format(mystring)
Объединяя все это:
s = "The subtotal was:"
a = 24.95
print("{:20s}{:>7s}".format(s, "${.2f}".format(a))
Ответ 2
Если вы знаете максимальные размеры текста и цифр, вы можете сделать
val_str = '${:.2f}'.format(val)
print('{:<18} {:>6}'.format(name+':', val_str))
Это становится сложнее, если они не известны заранее. Здесь подход, предполагающий names
и values
, является списком:
value_format = '${:.2f}'.format
name_format = '{}:'.format
values_fmt = [value_format(val) for val in values]
names_fmt = [name_format(name) for name in names]
max_value_len = max(len(x) for x in values_fmt)
max_name_len = max(len(x) for x in names_fmt)
for name, val in zip(names_fmt, values_fmt):
print('{:<{namelen}} {:>{vallen}}'.format(name, val,
namelen=max_name_len, vallen=max_value_len))
Ответ 3
subTotal = 24.95
tax = subTotal * 0.0725
total = subTotal + tax
paid = 30
change = paid-total
text = [
"The subtotal was:", "The tax was:", "The total was:",
"The customer paid:", "Change due:"
]
value = [ subTotal, tax, total, paid, change ]
for t,v in zip(text, value):
print "{0:<25} ${1:.2f}".format(t, v)
Выход
The subtotal was: $24.95
The tax was: $1.81
The total was: $26.76
The customer paid: $30.00
Change due: $3.24
Вы также можете получить требуемое расстояние следующим образом:
maxLen = max(len(t) for t in text)
for t,v in zip(text, value):
print str("{0:<" + str(maxLen) + "} ${1:.2f}").format(t, v)
Ответ 4
См. http://docs.python.org/2/library/string.html#grammar-token-width
def myformat(name, value):
return "{:<18} {:>6}".format(name, "${:.2f}".format(value))
print(myformat("The subtotal was:", subTotal))
print(myformat("The tax was:", tax))
print(myformat("The total was:", total))
print(myformat("The customer paid:", paid))
print(myformat("Change due:", change))
выход:
The subtotal was: $24.95
The tax was: $1.81
The total was: $26.76
The customer paid: $30.00
Change due: $3.24
Ответ 5
subTotal = 24.95
tax = subTotal * 0.0725
total = subTotal + tax
paid = 30
change = paid-total
print("The subtotal was: %8s" % ("$%.2f" % subTotal))
print("The tax was: %8s" % ("$%.2f" % tax))
print("The total was: %8s" % ("$%.2f" % total))
print("The customer paid:%8s" % ("$%.2f" % paid))
print("Change due: %8s" % ("$%.2f" % change))