Build a Budget App Project - Build a Budget App Project

Tell us what’s happening:

I can’t solve the final bit the output looks the same as the expected output (for the barchart)
create_spend_chart should print a different chart representation. Check that all spacing is exact.

``````class Category:
def __init__(self,name):
self.name = name
self.ledger = []

def deposit(self,amount,explaination=''):
if amount > 0:
self.ledger.append({'amount':amount,'description':explaination})

def withdraw(self,amount,explaination=''):
if amount > 0 and self.check_funds(amount):
self.ledger.append({'amount':-amount,'description':explaination})
return True
return False

def get_balance(self):
return sum(item['amount'] for item in self.ledger)

def transfer(self,amount,category):
if amount > 0 and self.check_funds(amount):
self.withdraw(amount, f"Transfer to {category.name}")
category.ledger.append({"amount": amount, "description": f"Transfer from {self.name}"})
return True
return False

def check_funds(self,amount):
return amount <= self.get_balance()

def __str__(self):
title = f"{self.name:*^30}\n"
items = ""
for item in self.ledger:
description = item['description'][:23].ljust(23)
amount = f"{item['amount']:>7.2f}"
items += f"{description}{amount}\n"
total = f"Total: {self.get_balance():.2f}"
return title + items + total

def create_spend_chart(categories):
title = "Percentage spent by category\n"

# 计算每个类别的支出百分比
percentages = []
for category in categories:
total = sum(item['amount'] for item in category.ledger)
spent = sum(item['amount'] for item in category.ledger if item['amount'] < 0)
percentage = int((abs(spent) / total * 100) // 10 * 10)
percentages.append((category.name, percentage))

# 绘制图表
chart = ""
for i in range(100, -1, -10):
chart += f"{i:3d}| "
for _, percentage in percentages:
chart += "o  " if percentage >= i else "   "
chart += "\n"

# 添加底部横线
chart += "    -" + "---" * (len(categories))+ "\n"

# 添加类别名称
max_name_length = max(len(name) for name, _ in percentages)
for i in range(max_name_length):
chart += "     "
for name, _ in percentages:
chart += f"{name[i] if i < len(name) else ' '}  "
chart += "\n"

return title + chart.rstrip("\n")

if __name__ == "__main__":
food = Category("Food")
food.deposit(1000, "initial deposit")
food.withdraw(70.15, "groceries")
food.withdraw(15.89, "restaurant and more food for dessert")
clothing = Category('Clothing')
food.transfer(50, clothing)
print(food)
print(clothing)
print(create_spend_chart([food,clothing]))
``````

User Agent is: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36`

Challenge Information:

Build a Budget App Project - Build a Budget App Project

At the bottom of the instructions, above the “Run Tests” button:

Note: open the browser console with F12 to see a more verbose output of the tests.

This will help read the error in the browser console:

The assertion error and diff gives you a lot of information to track down a problem. For example:

``````AssertionError: 'Year' != 'Years'
- Year
+ Years
?     +
``````

Your output comes first, and the output that the test expects is second.

AssertionError: ‘Year’ != ‘Years’

Your output: `Year` does not equal what’s expected: `Years`

This is called a diff, and it shows you the differences between two files or blocks of code:

``````- Year
+ Years
?     +
``````

`-` Dash indicates the incorrect output
`+` Plus shows what it should be
`?` The Question mark line indicates the place of the character that’s different between the two lines. Here a `+` is placed under the missing `s` .

Here’s another example:

``````E       AssertionError: Expected different output when calling "arithmetic_arranger()" with ["3801 - 2", "123 + 49"]
E       assert '  3801      123    \n   - 2     + 49    \n------    -----    \n' == '  3801      123\n-    2    +  49\n------    -----'
E         -   3801      123
E         +   3801      123
E         ?                ++++
E         - -    2    +  49
E         +    - 2     + 49
E         - ------    -----
E         + ------    -----
E         ?                +++++
``````

The first line is long, and it helps to view it as 2 lines in fixed width characters, so you can compare it character by character:

``````'  3801      123    \n   - 2     + 49    \n------    -----    \n'
'  3801      123\n-    2    +  49\n------    -----'
``````

Again, your output is first and the expected output is second. Here it’s easy to see extra spaces or `\n` characters.

``````E         -   3801      123
E         +   3801      123
E         ?                ++++
``````

Here the `?` line indicates 4 extra spaces at the end of a line using four `+` symbols. Spaces are a little difficult to see this way, so it’s useful to use both formats together.

I hope this helps interpret your error!