純文字,不是完美資料
每一行應該是 名稱|數量|單價。有些行會是空行、格式錯誤,或包含無法轉換的數字。
把字串、列表、字典、迴圈、函式、錯誤處理和 JSON 串成一個小程式。輸入故意是髒的,輸出應該可預測。
每一行應該是 名稱|數量|單價。有些行會是空行、格式錯誤,或包含無法轉換的數字。
回傳商品列表、總額和錯誤列表。列印只是結果的一種呈現,不是結果本身。
使用 Python 內建的字串、列表、字典、函式、例外和 json 模組。不安裝套件,不讀寫檔案,不連網,也不使用 input()。
把收據拆成多行,去掉前後空白,跳過空行;但保留行號,出錯時才能指出是哪一行。
按豎線拆分每一行,要求恰好三個欄位;數量轉成 int,單價轉成 float,名稱為空要拒絕。
數量必須為正,單價不能為負。記錄錯誤後繼續處理下一行;一行壞資料不應該毀掉整張收據。
為每個商品產生帶兩位小數的 line_total,最後只彙總一次,避免總額與明細對不上。
回傳包含 items、total、errors 的字典。用單獨的函式排版,再列印 JSON 摘要方便檢查。
結構可預測,比一堆列印文字更容易測試。
{
"items": [
{"name": "Latte", "qty": 2, "price": 4.5, "line_total": 9.0}
],
"total": 18.75,
"errors": []
}起始程式可以執行,但回傳空結果。補完 TODO 後再執行。參考答案同時解析正常收據和壞收據,並做自檢。
接受可選折扣率,驗證後作用於總額,同時在結果中保留折扣前的金額。
熟悉 csv 模組後,把豎線樣本換成小型 CSV 檔案,重用同一套驗證邏輯。
把三個驗收場景寫成 assert。以後每次改程式,先跑測試,再改排版。