CLI家計簿アプリの機能追加。自分の考えたことをコードに!【家計簿アプリ開発#5】

CLI家計簿アプリの機能追加。自分の考えたことをコードに!【家計簿アプリ開発#5】

1.前回の振り返り

前回の投稿はこちらから

⬛︎AI作の家計簿アプリをわだ作家計簿アプリにするために、追加したい機能について考えられることを全て書き出してみた。ここまで。

2.本日の作業内容

①AI作コードでは「20万」や「5千」と入力すると、エラーになりプログラムが止まる部分を修正。
②メニューで収支を選択した際、支出はユーザーがマイナスの値で入力する必要があった部分を修正。

3.実際のコードと解説

修正した部分のみ解説し、最後に全体のコードを貼ります。

「万」「千」「百」「十」を桁数分の「0」で置き換え対応、その他の文字はエラー表示で対応する関数を作成。

def parse_amount_input(input_value):
    """数値入力を解析して文字(万)や(千)に対応する"""
    try:
        input_value = input_value.strip().replace(",", "")

        # 万を 0000に変換
        if "万" in input_value:
            input_value = input_value.replace("万", "0000")

        # 千を 000に変換
        if "千" in input_value:
            input_value = input_value.replace("千", "000")

        # 百を00に変換
        if "百" in input_value:
            input_value = input_value.replace("百", "00")

        # 十を0に変換
        if "十" in input_value:
            input_value = input_value.replace("十", "0")

        return int(input_value)
    
    except ValueError:
        raise ValueError(f"数値として認識できません: {input_value}")

「万」「千」「百」「十」は.replaceを使って「0」に置き換えるという方法で対応。

②メニューで収支が選ばれたら、さらに収入か支出かを選択→収入は+で、支出はーで記録されるように修正。

def add_record():
while True:
print("1: 収入")
print("2: 支出")
choice = input("番号を選んでください (1: 収入, 2: 支出): ")

if choice == "1":
category = "収入"
d = input("日付(空欄で今日): ") or str(date.today())
while True:
try:
amount_input = input("収入を入力してください(例: 15万, 5千, 500): ")
amount = abs(parse_amount_input(amount_input))
break
except ValueError as e:
print(f"エラー: {e}")
print("例: 150000, 15万, 5千, 500")
break

elif choice == "2":
category = "支出"
d = input("日付(空欄で今日): ") or str(date.today())
category = input("項目: ")
while True:
try:
amount_input = input("支出を入力してください(例: 15万, 5千, 500): ")
amount = -abs(parse_amount_input(amount_input))
break
except ValueError as e:
print(f"エラー: {e}")
print("例: 150000, 15万, 5千, 500")
break
else:
print("無効な入力です。もう一度入力してください。\n")

note = input("メモ: ")

with open(FILENAME, "a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow([d, category, amount, note])
print("記録しました。")

・absを使って絶対値を取ることで、必ず収入は+、支出はーで記録されるようにした。
「万」「千」「百」「十」以外の文字が入力された場合はexceptでエラー表示し、while Trueを使って再入力を促すように修正した。

最後に全体のコードです

import csv
from datetime import date

FILENAME = "money_diary.csv"

def parse_amount_input(input_value):
"""数値入力を解析して文字(万)や(千)に対応する"""
try:
input_value = input_value.strip().replace(",", "")

# 万を 0000に変換
if "万" in input_value:
input_value = input_value.replace("万", "0000")

# 千を 000に変換
if "千" in input_value:
input_value = input_value.replace("千", "000")

# 百を00に変換
if "百" in input_value:
input_value = input_value.replace("百", "00")

# 十を0に変換
if "十" in input_value:
input_value = input_value.replace("十", "0")

return int(input_value)

except ValueError:
raise ValueError(f"数値として認識できません: {input_value}")


def add_record():
while True:
print("1: 収入")
print("2: 支出")
choice = input("番号を選んでください (1: 収入, 2: 支出): ")

if choice == "1":
category = "収入"
d = input("日付(空欄で今日): ") or str(date.today())
while True:
try:
amount_input = input("収入を入力してください(例: 15万, 5千, 500): ")
amount = abs(parse_amount_input(amount_input))
break
except ValueError as e:
print(f"エラー: {e}")
print("例: 150000, 15万, 5千, 500")
break

elif choice == "2":
category = "支出"
d = input("日付(空欄で今日): ") or str(date.today())
category = input("項目: ")
while True:
try:
amount_input = input("支出を入力してください(例: 15万, 5千, 500): ")
amount = -abs(parse_amount_input(amount_input))
break
except ValueError as e:
print(f"エラー: {e}")
print("例: 150000, 15万, 5千, 500")
break
else:
print("無効な入力です。もう一度入力してください。\n")

note = input("メモ: ")

with open(FILENAME, "a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow([d, category, amount, note])
print("記録しました。")

def show_records():
total = 0
print("\n=== 家計簿一覧 ===")

try:
with open(FILENAME, "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
total += int(row[2])
print(f"\n合計残高: {total}円\n")
except FileNotFoundError:
print("記録がありません。\n")

def main():
while True:
print("=== 家計簿アプリ ===")
print("1. 収支を追加")
print("2. 記録確認と残高表示")
print("3. 終了")
choice = input("番号を選んでください: ")

if choice == "1":
add_record()
elif choice == "2":
show_records()
elif choice == "3":
print("アプリを終了します。")
break
else:
print("無効な入力です。もう一度入力してください。\n")

if __name__ == "__main__":
main()

4.学びと今後の課題

 とりあえず修正したいところを変えてみて、動作的には理想の形になっているけれど、コードが読みにくくなったし、def parse_amount_input(input_value):とdef add_record():どちらもでエラーを表示するようにしてたりでややこしくなってしまった。どう改善すれば良いのかも含めて考えたい。
 と同時に、まだまだ改善したいところはある!一つ一つ取り組んでいきたい。

ちゃんと完成するのだろうか。

とりあえず、今の目標はCLI家計簿アプリに自分の使いたい機能を追加することと、自分のできる範囲でコードを読みやすくすること

5.次回の予定

⬛︎①と②のエラー表示はどちらかだけで良いような気がする→考えて改善する
⬛︎③収入と支出でしか管理できないについて改善する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

どうもこんにちは、わだです。プログラミングなんて未知の世界。そんなわだがエンジニアになるまでを綴っていきます。

コメント

コメントする