Tell us what’s happening:
I cannot pass the last test which is about the chart and I cannot use my browser console to see what is wrong as my laptop broke and currently doing the project on my ipad. Can somebody help??
Your code so far
class Category:
def __init__(self, name):
self.name = name
self.ledger = []
self.balance = 0
def deposit(self, amount, description = ''):
space = 26 + len(self.name[:23]) - len(description[:23]) - len(str(amount)) - 3
#self.ledger.append(f'{description}{" " * space}{amount:>7.2f}')
self.ledger.append({'amount': amount, 'description': description})
self.balance += amount
def withdraw(self, amount2, description2 = ''):
self.balance -= amount2
space2 = 26 + len(self.name[:23]) - len(description2[:23]) - len(str(amount2)) - 2
if self.balance >= 0:
#self.ledger.append(f'\n{description2[:23]}{" " * space2}{0 - amount2:>7.2f}')
self.ledger.append({'amount': 0 - amount2, 'description': description2})
return True
return False
def get_balance(self):
return self.balance
def transfer(self, amount3, category_name):
self.balance -= amount3
if self.balance >= 0:
self.ledger.append({'amount': 0 - amount3, 'description': f'Transfer to {category_name.name}'})
category_name.deposit(amount3, f'Transfer from {self.name}')
return True
return False
def check_funds(self, amount4):
if amount4 > self.balance:
return False
elif amount4 <= self.balance:
return True
def __str__(self):
space3 = round((30 - len(self.name)) / 2)
#return f'{"*" * space3}{self.name}{"*" * space3}\n{"".join(self.ledger)}\nTotal: {self.balance:>7.2f}'
#print(len(self.ledger))
result = f'{"*" * space3}{self.name}{"*" * space3}\n'
for i in range(0, len(self.ledger)):
formatted = f'{self.ledger[i]["amount"]:>7.2f}'
space4 = 30 - len(formatted) - len(self.ledger[i]['description'][:23])
#print(self.ledger[i]['description'])
#print(formatted)
result += f'{self.ledger[i]["description"][:23]}{" " * space4}{self.ledger[i]["amount"]:>7.2f}\n'
result += f'Total: {self.balance:>.2f}'
return result
def create_spend_chart(categories):
#print('function called with:',categories)
#if isinstance(categories, list):
#print('yes')
#print(''.join(categories))
category_names = [category.name for category in categories]
#print(category_names)
string = f'Percentage spent by category'
string += f'\n'
list2 = []
list3 = []
for k in range(0,len(category_names),1):
#print(k)
collect_minus = [a['amount'] for a in categories[k].ledger if a['amount'] < 0]
sum_of_it = sum(collect_minus)
list2.append(sum_of_it)
list3.append(sum_of_it)
list2 = sum(list2)
#print(list2)
list3 = [int((a / list2 * 100)) for a in list3]
#print('list3:',list3)
range1 = range(100,-1,-10)
range2 = range(0,len(list3),1)
list4 = []
#for j in range2:
for i in range1:
if len(list3) == 1:
value2 = ' o' if list3[0] >= i else ''
value3 = ''
value4 = ''
value5 = ''
elif len(list3) == 2:
value2 = ' o' if list3[0] >= i else ''
value3 = ' o' if list3[1] >= i else ''
value4 = ''
value5 = ''
elif len(list3) == 3:
value2 = ' o' if list3[0] >= i else ''
value3 = ' o' if list3[1] >= i else ' '
value4 = ' o' if list3[2] >= i else ' '
value5 = ''
else:
value2 = ' o' if list3[0] >= i else ''
value3 = ' o' if list3[1] >= i else ' '
value4 = ' o' if list3[2] >= i else ' '
value5 = ' o' if list3[3] >= i else ''
#you do not need the outer for loop? there is no 'j' used
string += f'{" " * (4 - len(str(i)) - 1)}{i}|{value2} {value3} {value4} {value5}\n'
string += f' {"-" * (len(list3) * 3 + 1)}\n'
#print(category_names)
list5 = []
for i in range2:
abc = ''.join(category_names[i])
defg = ' '.join(abc)
category_names1 = ['\n'.join(word) for word in category_names]
sum_of_it2 = sum([len(a) for a in category_names])
#print(sum_of_it2)
for i in range(sum_of_it2):
joining = ''.join(category_names)
for j in range(len(joining)):
#print(j)
joining2 = '\n'.join(joining[j])
#string += f'{joining2}'
if j == len(category_names[0]) - 1 or j == sum_of_it2 - 1:
make_space = ' '
max_1 = max([len(i) for i in category_names])
#print('a',range2)
if len(category_names) == 1:
name = category_names[0].ljust(len(category_names[0]))
for i in range(len(category_names[0])):
string += f' {name[i]}\n'
elif len(category_names) == 2:
max_name_length = max(len(category_names[0]), len(category_names[1]))
name1 = category_names[0].ljust(max_name_length)
name2 = category_names[1].ljust(max_name_length)
#print(name1, name2)
for i in range(max_name_length):
string += f' {name1[i]} {name2[i]}\n'
elif len(category_names) == 3:
max_name_length2 = max(len(category_names[0]), len(category_names[1]), len(category_names[2]))
name1 = category_names[0].ljust(max_name_length2)
name2 = category_names[1].ljust(max_name_length2)
name3 = category_names[2].ljust(max_name_length2)
for i in range(max_name_length2):
string += f' {name1[i]} {name2[i]} {name3[i]}\n'
elif len(category_names) == 4:
max_length3 = max(len(category_names[0]), len(category_names[1]), len(category_names[2]), len(category_names[3]))
name1 = category_names[0].ljust(max_length3)
name2 = category_names[1].ljust(max_length3)
name3 = category_names[2].ljust(max_length3)
name4 = category_names[3].ljust(max_length3)
for i in range(max_length3):
string += f' {name1[i]} {name2[i]} {name3[i]} {name4[i]}\n'
return string
#fix the ledger so you can append with the value with object
food = Category('Food')
food.deposit(1000, 'deposit')
food.withdraw(10.15, 'groceries')
food.withdraw(15.89, 'restaurant and more food for dessert')
clothing = Category('Clothing')
food.transfer(50, clothing)
clothing.withdraw(23.21, 'bought a shirt')
shoes = Category('Shoes')
food.transfer(80, shoes)
shoes.withdraw(78.51, 'bought a pair of shoes')
emergency = Category('Emergency')
food.transfer(50, emergency)
emergency.withdraw(25, 'medical insurance')
print(food)
print(clothing)
print(shoes)
print(emergency)
print(create_spend_chart([food, clothing, ]))
#print(create_spend_chart(food))
Your browser information:
User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15
Challenge Information:
Build a Budget App Project - Build a Budget App Project