今日のPython 第30回「収支欄を分けて表示&JavaScriptで数値を3桁カンマ区切りにして表示」W013

2025年1月26日日曜日

Python_WEBアプリ編 公開

t f B! P L
「礼」の~IT人材を目指して~ 
作成:2025/1/26
更新:ー
W013


はじめに

このブログでは、PythonでWEBアプリの作成を進めています。少しづつ機能を追加して、ローカルの仮想環境で動作確認をするという作業を地道に行っている状況です。

そして、進捗がある都度、このブログで紹介しています。


前回までの状況

現在、WEBアプリで家計簿のページを作成をすすめています。(→参考

前回は、複数ある家計簿関連のページにつながりを持たせてみました。TOP画面を作って、そこからurl_for関数やアンカータグで画面遷移できるようになっています。(→参考

現在は、画面1のように表示されます。


■画面1:ログイン後の家計簿画面■


改善が必要な点

収支計算をするためには、金額入力時に収入、支出のいずれかをマイナスで入力しないといけないため、入力間違いのもとになります。

また、収支一覧に表示される金額もマイナスで表示されるため、見映えが悪いという問題もあります。

金額を3桁毎に区切るカンマが無いという点も見映えの悪さに1役をかっています。


今回実施すること

そこで、改善策として、今回は以下の2点の修正を行います。

(1)収入と支出の欄を分けて表示

(2)数値を3桁カンマ区切りにして表示


関連ファイルの説明

今回の改善のために次のファイルを修正又は追加します。

main.py 修正
KDpay.py 修正
kd.html 修正
layout.html 修正
index_body.js 追加

この後紹介するプログラムの修正は、関連する部分のみを抜粋して説明しています。

全体のどの部分を修正しているのかを確認される場合は、こちらを必要に応じてご覧ください。(→参考)

このプロジェクトで使用するファイルやフォルダ構成を、このページで解説しています。


(1)収入と支出の欄を分けて表示

では、順を追って修正箇所を紹介していきます。

①項目の追加
「金額」として、一列で処理していた収支を、「収入」と「支出」に分けます。

 ■コード0■
    

class Pay:
    def __init__(self, pay_data):
        # ペイ(収支)データの初期化
        self.month   = pay_data["month"]       
        self.day     = pay_data["day"]
        self.content = pay_data["content"]
        self.amount  = pay_data["amount"]
        self.id      = pay_data["id"] #--- 追加10-2
        self.user    = pay_data["user"] #--- 追加10
        self.amount2  = pay_data["amount2"] #--- 追加13
        
■解説■
  • クラスで"amount2"を新たに定義します。
  • "amount2"を追加したことにより、他のファイルも関係する個所を修正。詳細説明は割愛します。

②収支合計値の計算


 サーバー側で計算して、テンプレートkd.htmlに送ることも考えました。(コード1参照)
 ■コード1■
    

    if request.method == 'GET':

        search_list_amount_list = [d.get('amount') for d in search_list] #--- 修正13 # 追記
        amount_sum = sum(int(i) for i in search_list_amount_list) #--- 修正13 # 追記 # 文字列を整数に変換してsum()を実行
        search_list_amount2_list = [d.get('amount2') for d in search_list] #--- 修正13 # 追記
        amount2_sum = sum(int(i) for i in search_list_amount2_list) #--- 修正13 # 追記 # 文字列を整数に変換してsum()を実行
        amount_sum_total = amount_sum - amount2_sum #--- 修正13 # 追記
        
        # 更新した辞書型リストを送信し、HTMLをレンダリング        
        return render_template('kakeibo_test_json/kd.html', title='kakeibo',user_name = user_name , pay_list = search_list , amount_sum = amount_sum ) #--- 修正13 # amount_list = search_list_amount_list 追記 #--- 修正10 '''修正前''''''# return render_template('kakeibo_test_json/kd.html', title='kakeibo', pay_list = pay_manager.pay_data_list) #--- 修正7-4 

■■


しかし、画面更新のタイミングで最新の情報が表示されないため、
従来通りテンプレートkd.htmlで計算させることにしました。(コード2参照)

 ■コード2■

残高

{% set amount_list = [] %} {% for payy in pay_list %} {%- set _ = amount_list.append(payy.amount|int ) -%} {% endfor %} {% set amount2_list = [] %} {% for payy2 in pay_list %} {%- set _ = amount2_list.append(payy2.amount2|int ) -%} {% endfor %}
■解説■




(2)数値を3桁カンマ区切りにして表示

CSSで簡単に設定できるのかと思っていましたが、調べてみると、PHPやJavaScryptで実装しないといけないようです。

PHPのほうが少ないコードで実装できるようですが、今回は、JavaScryptで実装することにします。

まず、3桁カンマで区切る部分を、HTML上でclass="comma”で定義します。


 ■コード3■
  (略) 残高: {{ amount2_list|sum - amount_list|sum }} (支出合計: {{ amount_list|sum }} 収入合計: {{ amount2_list|sum }} )   (略)

収支一覧

  (略)
番号 内訳 支出 収入
{{ cnt[0] }} {{ pay.month }} {{ pay.day }} {{ pay.content }} {{ pay.amount }} {{ pay.amount2 }}
■解説■

残高と収支一覧の数字を3桁表示します


次に、class="comma”部分を、装飾するためのコードをJavaScryptで記述し、ファイル名をindex_body.jsとして新たに作成します。

  ■コード4■

   
  

$('span.comma ').each(
    function(){
        var commatxt = $(this).text();
        $(this).text(Number(commatxt).toLocaleString());
    }
);



$('td.comma ').each(
        function(){
                var commatxt = $(this).text();
                $(this).text(Number(commatxt).toLocaleString());
        }
);







■解説■

JavaScript のNumber().toLocaleString()について

  •  text(Number(commatxt).toLocaleString()) は、commatxt という文字列を数値に変換し、それをロケール(地域)に合わせた文字列形式に変換する JavaScript のコードです。
  • toLocaleString() の引数にロケールを指定することで、特定の地域に合わせた文字列形式に変換できます。
  • 例えば、Number(commatxt).toLocaleString("ja-JP") は、日本語のフォーマットで3桁ごとにカンマを挿入します。
  • commatxt は、数値の文字列表現を表す変数の名前です。
  • commatxt が "1234567890" の場合、「1,234,567,890」というな結果を表示します。

jQueryのeachメソッドついて

  • jQueryはWebブラウザ用のJavaScriptのコードをより短く容易に記述できるように設計されたJavaScriptのライブラリです。
  • jQueryのeachメソッドで、繰り返し処理を行うには$(…).each(処理内容)という形で実装します。
  • HTML要素に対してeach()を実行し、繰り返し処理を記述する関数を指定します。

    HTML要素.each(function(index, element) {

          //繰り返し処理を記述する

    })


最後に、HTMLからindex_body.jsとjQueryにリンクします。

 
 ■コード5■
(head内に記述)

 
 


(body内に記述)




■解説■

jQueryへのリンクについて
  • CDN(Content Delivery Network)を使って、HTMLファイルにjQueryを読み込みます。(コード5の2行目参照)
  • CDNは、公開されたネットワーク上のサーバからコンテンツを配信する仕組みです。
  • jQueryのバージョンは特に理由がなければ最新のものを使います。
  • jQueryを記述したJavaScriptファイルより先に記述しないとエラーが発生するので注意が必要です。
index_body.jsへのリンクについて
  • index_body.jsをstatic\javascript\フォルダにおいてurl_for関数でリンクします。


実施結果

では、ブラウザで表示してみます。

仮想環境ですので

http://127.0.0.1:5000/index

として表示すると、このように表示されます。

表示画面


■画面2■


■解説■

金額の数字には3桁ごとにカンマが入って、収入と支出の欄も分かれて表示されています。


おわりに

以上、今回は改善策として、

(1)収入と支出の欄を分けて表示

(2)数値を3桁カンマ区切りにして表示

の2点の修正を行いました。

画面がずいぶん見やすくなった印象です。

これからも、見やすさ、使いやすさの向上に努めてまいりたいと思います。










このブログを検索

アーカイブ

カテゴリー

QooQ