im having the same issue but free code camp also want let me post on the forum
create_spend_chart should print a different chart representation. Check that all spacing is exact.
it matches the output but doesnt mark as complete
class Category:
def __init__(self,name):
self.ledger=[]
self.name=name
def __str__(self):
length=len(str(self.name))
start=(30-length)//2
header= '*'*start+str(self.name)+'*'*start
finals=""
count=0
for record in self.ledger:
desc=record['description']
if len(desc)==23:
desc=record['description']
elif len(desc)>23:
desc=record['description'][:23]
else:
desc=desc+' '*(23-len(desc))
amts=(record['amount'])
if type(record['amount']) is float:
amt=(f" {amts}")
else:
amt=(f" {amts}.00")
if len(amt)==7:
amt=amt
elif len(amt)>7:
amt=amt[len(amt)-7:]
else:
amt=' '*(7-len(record['description']))+str(amt)
spacing=30-len(amt)-len(desc)
finals+= "\n"+ desc +" "*(spacing)+ amt
fund=str(self.get_balance())
if type(self.get_balance()) is float:
total=(f"{fund}")
else:
total=(f"{fund}.00")
total="\nTotal: " + total
return header + finals + total
def deposit(self,amount,description=''):
newEntry={"amount": amount, "description": description}
self.ledger.append(newEntry)
def get_balance(self):
balance=0
for record in self.ledger:
balance+=record["amount"]
return balance
def withdraw(self,amount,description=''):
withdrawal=False
newEntry={"amount": -amount, "description": description}
if self.check_funds(amount):
self.ledger.append(newEntry)
return True
else:
return False
def check_funds(self,amount):
if amount>self.get_balance():
return False
else:
return True
def transfer(self,amount,budget):
message1="Transfer to "+ budget.name
if self.check_funds(amount):
self.withdraw(amount,message1)
message2="Transfer from "+ self.name
budget.deposit(amount, message2)
return True
else:
return False
def create_spend_chart(categories):
barchart=""
barchartL=[]
percents=[]
totalSpent=0
spending=[]
count=100
while count>=0:
if count==100:
barchartL.append(str(count)+"|")
elif count!=0:
barchartL.append(" "+str(count)+"|")
else:
barchartL.append(" "+str(count)+"|")
count-=10
barchartL.append(' '*4+'-'*(3*len(categories)+1))
for item in categories:
spent=0
for amount in item.ledger:
if amount['amount']<0:
spent+=amount['amount']
spending.append(-spent)
for spent in spending:
totalSpent+=spent
for index,item in enumerate(categories):
percent=round(spending[index]/totalSpent*100,-1)
percents.append(percent)
for index,per in enumerate(percents):
per+=10
while per>0:
barchartL[11-int(per/10)]+= ' '*((1+index)*3+1-len(barchartL[11-int(per/10)]))+' o'
per-=10
categoriesL=[]
for item in (categories):
categoriesL.append(item.name)
items=0
categoriesL.sort(reverse=True)
for char in categoriesL[0]:
barchartL.append(' ')
while items<len(categoriesL):
expectedLength=5+items*3
for l in range(len(categoriesL[0])):
barchartL.append(' '*3)
count=12
for char in categories[items].name:
barchartL[count]+=' '*(expectedLength-len(barchartL[count]))+ char
count+=1
items+=1
for line in barchartL:
barchart+=line +'\n'
barchart=barchart.strip()
return ("Percentage spent by category" + "\n"+barchart)
#example
food = Category("Food")
entertainment = Category("Entertainment")
business = Category("Business")
food.deposit(900, "deposit")
entertainment.deposit(900, "deposit")
business.deposit(900, "deposit")
food.withdraw(105.55)
entertainment.withdraw(33.40)
business.withdraw(10.99)
print(create_spend_chart([business, food,business, food ]))
theres the code