2015-05-11 2 views
1

Я планирую совершить поездку в Disney World поздно этим летом, и я пытался составить программу для расчета приблизительной стоимости поездки для веселиться и стараться держаться от слишком ржавой. Моя проблема в том, что когда я пытаюсь отобразить все мои расчетные значения, я продолжаю получать ошибку, которая находится в названии. Мой код:Ошибка печати строки:% d format: требуется номер, а не str

###Function to display costs 
def Display(days, nights, building_type, person, room_cost, 
      room_cost_person, DisneyPark, Hopper, IslandPark, 
      IslandPTP, Island_parking, gas_cost, gas_cost_person, 
      park_person, Total_cost_person, mpg, gas, downpay): 
print('''Cost of trip for a %i day/%i night stay in a %%s%%: 
Number of people going:       %i 

Total room cost ($)        %4.2f 
Room cost/person ($)        %4.2f 

Price of Disney World tickets ($)    %4.2f 
Price of hopper ticket-Disney ($)    %4.2f 
Price of Universal ticket ($)     %4.2f 
     Park-to-Park        %%s%% 
Cost to park at Universal/person ($)    %4.2f 

Total cost of gas ($)       %4.2f 
Cost of gas/person ($)*       %4.2f 
Cost to park/person ($)       %4.2f 

Cost of groceries/person ($)^     %4.2f 
Cost to eat out/person ($)^#      %4.2f 
Souvenirs ($)^         %4.2f 

Total cost of trip/person ($)     %4.2f 

*Factoring in round trip distance (1490 miles), mpg of %i, and average gas cost $%4.2f 
#Covers eating out at night, eating in parks (butterbeer, etc), and eating while driving 
^Note that these are estimates 
%Note that the Villa housing requires a $%4.2f downpayment (refundable) that was not 
     included in cost calculations 

----------------------------------------------------------------------------------------''' 
%(day, night, Building, person, room_cost, room_cost_person, DisneyPark, 
    Hopper, IslandPark, IslandPTP, Island_parking, gas_cost, gas_cost_person, 
    park_person, Groceries, Eat, Souvenirs, Total_cost_person, mpg, gas, 
    downpay)) 

Я смотрел на предложения по этому вопросу: Python MySQLdb issues (TypeError: %d format: a number is required, not str) и я попытался внести изменения, указанные, но они не были полезны для меня. Я могу индивидуально печатать каждое значение просто отлично, но когда я пытаюсь распечатать их все в этом большом блоке текста, я получаю свою ошибку. Я был бы признателен за любое понимание, которое может предложить любой.

+4

Это было бы намного проще, если бы вы разделили его на отдельные линии, тогда вы могли бы выяснить, какая из них является проблемой. – jonrsharpe

+0

Это не докшрин. –

+1

Если у вас так много спецификаторов форматирования, что вы не можете поместить все аргументы в одну 80-значную строку даже с выделенными пробелами, пришло время начать использовать спецификаторы именованного формата и передать dict. – abarnert

ответ

1

Возможно, ошибка вызвана одной из форм формы %i. Например, следующий код:

'this is %i' % '5' 

Это вернёт ту же ошибку: TypeError: %d format: a number is required, not str.

0

Есть много вещей, которые вы можете улучшить в этом коде (читайте комментарии!).

Попробуйте изменить тип переменной в соответствии с тем, что вы хотите напечатать:

'Print string as %s, integers as %i ou %d, and float as %4.2f' % \ 
('5', int('5'), int('5'), float('5')) 
0

В то время как ваша функция работает, это скорее склонны к перепутать много аргументов. Это улучшенная версия. Я использовал только часть текста, а остальные должны быть прямо вперед:

TEMPLATE = """ 
Cost of trip for a {days} day/{nights} night stay in a %{building_type}%: 
Number of people going:       {person} 

Total room cost ($)        {room_cost:4.2f} 
Room cost/person ($)        {room_cost_person:4.2f} 
""" 


data = {'days': 3, 'nights': 2, 'building_type': 'hotel', 
     'person': 4, 'room_cost': 80, 'room_cost_person': 20} 

def display_costs(data, template=TEMPLATE): 
    """Show the costs in nicely readable format. 
    """ 
    print(template.format(**data)) 


display_costs(data)  

Это печатает:

Cost of trip for a 3 day/2 night stay in a %hotel%: 
Number of people going:       4 

Total room cost ($)        80.00 
Room cost/person ($)        20.00 

Я определил текст в шаблоне вне функции. Вы даже можете определить его дополнительный файл и прочитать этот файл. Использование словаря data может помочь организовать ваши данные. Я использовал новый метод format() для строк. Это позволяет использовать синтаксис {} для ваших держателей мест. Вам не нужно определять форматы для строк и целых чисел, если вы не хотите, чтобы они отображались особым образом с точки зрения их положения или такого. Формат для float может быть указан с использованием этого синтаксиса {room_cost:4.2f}. Это дает вам два десятичных знака и общую ширину четырех, как и в случае старого %-форматирования. Наконец, я использовал ** в методе format(). Это эквивалентно написанию template.format(days=3, nights=2, ...), за исключением того, что не нужно повторять все записи из словаря data.

Смежные вопросы