Python Forum
How to print out multiple drinks instead of just one based on the input?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How to print out multiple drinks instead of just one based on the input?
#4
Here is my go at it. Modified
There is room for improvement.
#! /usr/bin/env python3

from subprocess import call
import os

call('clear' if os.name == 'posix' else 'cls')

class Menu:
    def __init__(self):
        pass
    def menu(self):
        self.menuitems = {'coffee':1.25, 'tea': 1, 'coke':1.75, 'water':.5}
        return self.menuitems

class AddTax:
    def add_tax(self, total, tax):
        return total*tax

class Discount:
    def discount(self, total, discount_amount=0):
        return total*discount_amount

class Display:
    def output(self, text):
        print(text.title())

class Controller:
    def __init__(self, menu=None, addtax=None, discount=None, display=None):
        self.menu = menu or Menu()
        self.addtax = addtax or AddTax()
        self.discount = discount or Discount()
        self.display = display or Display()

    def show_menu(self):
        dodads = []
        for k, val in self.menu.menu().items():
            dodads.append(f'{k}: ${format(val, "0.2f")}')
        self.display.output(f'Menu: {", ".join(dodads)}')

def main():
    controller = Controller()

    while True:
        try:
            print('What would you like to drink?')
            print('Format is item amount seperated by comma or space.')
            print('Example: coke 3, tea 1')
            print()
            controller.show_menu()
            order = input('>> ').lower().split()
            while True:
                print('Are you a member? (y/n)')
                member = input('>>> ')
                print()
                print('--------------- Receipt ------------')
                if member.strip() == 'y' or member.strip() == 'yes':
                    membership = True
                    break
                else:
                    membership = False
                    break

            if order and len(order) >= 2:
                iters = iter(order)
                result = dict(zip(iters, iters))
                total = []
                combined_total = []
                for menuitem, amount in result.items():
                    if menuitem in controller.menu.menu().keys():
                        total.append(controller.menu.menu()[menuitem])
                        cost = controller.menu.menu()[menuitem]
                        totalcost = f"{format(cost*int(amount.replace(',', ' ')), '0.2f')}"
                        combined_total.append(float(totalcost))
                        controller.display.output(f'Item: {menuitem} {" ":>2} Amount: {amount} {" ":>2} Cost: ${format(cost, "0.2f")} {" ":>2} Total: ${totalcost}')
                    else:
                        controller.display.output(f'Item: {menuitem} is not on the menu.')
                print()
                total = sum(combined_total)
                if membership == True:
                    discount = controller.discount.discount(total, 0.15)
                else:
                    discount = 0
                newtotal = total-discount
                tax = controller.addtax.add_tax(newtotal, 0.09)
                finaltotal = newtotal+tax
                controller.display.output(f'Total: ${format(total,"0.2f")}')
                controller.display.output(f'Discount: - ${format(discount, "0.2f")}')
                controller.display.output(f'Total: ${format(newtotal,"0.2f")}')
                controller.display.output(f'Tax: ${format(tax,"0.2f")}')
                controller.display.output(f'Total: ${format(finaltotal,"0.2f")}')
                break
            else:
                print('You will need to enter both item and amout.')
                continue
        except ValueError as error:
            print(error)

if __name__ == '__main__':
    main()
Output:
What would you like to drink? Format is item amount seperated by comma or space. Example: coke 3, tea 1 Menu: Coffee: $1.25, Tea: $1.00, Coke: $1.75, Water: $0.50 >> coke 2, tea 3, pepsi 1 Are you a member? (y/n) >>> y --------------- Receipt ------------ Item: Coke Amount: 2, Cost: $1.75 Total: $3.50 Item: Tea Amount: 3, Cost: $1.00 Total: $3.00 Sorry, Pepsi Is Not On The Menu. Total: $6.50 Discount: - $0.97 Total: $5.53 Tax: $0.50 Total: $6.02
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply


Messages In This Thread
RE: How to print out multiple drinks instead of just one based on the input? - by menator01 - Jul-01-2020, 04:15 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
Question Change elements of array based on position of input data Cola_Reb 6 2,193 May-13-2022, 12:57 PM
Last Post: Cola_Reb
  How to map two data frames based on multiple condition SriRajesh 0 1,515 Oct-27-2021, 02:43 PM
Last Post: SriRajesh
  Exit function from nested function based on user input Turtle 5 2,962 Oct-10-2021, 12:55 AM
Last Post: Turtle
Exclamation question about input, while loop, then print jamie_01 5 2,729 Sep-30-2021, 12:46 PM
Last Post: Underscore
  Xlsxwriter: Create Multiple Sheets Based on Dataframe's Sorted Values KMV 2 3,545 Mar-09-2021, 12:24 PM
Last Post: KMV
Question How to print multiple elements from multiple lists in a FOR loop? Gilush 6 3,001 Dec-02-2020, 07:50 AM
Last Post: Gilush
  Loop back through loop based on user input, keeping previous changes loop made? hbkpancakes 2 2,967 Nov-21-2020, 02:35 AM
Last Post: hbkpancakes
  How to print string multiple times on new line ace19887 7 5,840 Sep-30-2020, 02:53 PM
Last Post: buran
  print function help percentage and slash (multiple variables) leodavinci1990 3 2,528 Aug-10-2020, 02:51 AM
Last Post: bowlofred
  taking input doesnt print as list bntayfur 2 2,152 Jun-04-2020, 02:48 AM
Last Post: bntayfur

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020