[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.015 FormatNumber関数を使用して小数点固定、%を表示

FormatNumber関数を使用して小数点固定、%を表示



本文(発行内容)


<FormatNumber関数を使用して小数点固定、%を表示>

こんにちは、Ken3です。

前回は、
世の中、外見重要、男性も化粧する時代(オイオイ、ホントか?)
でした。(上の一行じゃ意味不明だけど)
今回も、アンケート結果の出力を少し変えてみます。
決り文句で、元が悪いと化粧もイミナイって?そんなぁ〜

あまり期待しないでね。

/*
 * 1.少し化粧をほどこした出力ページ
*/

前回までに行った、集計結果の表示パターンは、
http://www.ken3.org/cgi-bin/test/test013-3.asp  ←そのまま人数を表示
http://www.ken3.org/cgi-bin/test/test014-1.asp  ←表(TABLE)にした
http://www.ken3.org/cgi-bin/test/test014-2.asp  ←表にワクをつけた
でした。
どれもなんかしっくりこないと思いつつ、
今回も少しイタズラしてみます。

街中(インターネット上)でアンケート結果ページを見ると、
不満40.1%とか、%表示してますよね。

今回は、その化粧の方法をまねして、%表示にチャレンジしてみます。
なんだぁって感じですよね。

/*
 * 2.回答数÷全体数で計算だよね。
*/

%の計算は、回答数÷全体数で計算だよね。
それでは、軽く追加します。

-- test015-1.asp --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>%の計算は、回答数÷全体数で計算だよね</title>
</head>
<body>
<h2>%の計算は、回答数÷全体数で計算だよね</h2>
test015-1.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT(10)   'カウンター 変数 10個もいらないけど
dim nSUM       '*1回答の合計数

nSUM = 0       '初期化する

'カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    'Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    'nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
    '*2合計数は無条件にカウントアップ
    nSUM = nSUM + 1
Loop

ts.close  '使ったファイルは閉じようよ

Response.Write "アンケート回答数<b> " & nSUM & "</b>人です"  '*4回答数表示

'Array関数を使用して、評価コメントを初期化
strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _
               "まぁまぁ", "満足", "大変満足")

'結果の表示を<TABLE>タグを使用して表示
Response.Write "<TABLE border=1>"   'border=1で境界線(ワクを表示)
Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD>"
Response.Write "<TD>%</TD></TR>"   '*3 %の見出しを追加
'ループで回して評価の集計データを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD>" & nCNT(i) & "</TD>"
    '*5 %を計算して、表示する
    Response.Write "<TD>" & (nCNT(i) / nSUM) * 100 & "%</TD></TR>"
Next

Response.Write "</TABLE>"   '忘れずにテーブルを終わりにする

%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
</body>
</html>
---

いつもの軽く解説だと、
dim nSUM       '*1回答の合計数
nSUM = 0       '初期化する
で、合計数のカウンターを宣言、初期化してます。

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    ・
  ・
  ・
    '*2合計数は無条件にカウントアップ
    nSUM = nSUM + 1
Loop

ループ内で、そのままカウントしてます。
もうひとつの考え方で、回答の合計数だから、
nSUM = nCNT(0) +  nCNT(1) + nCNT(2) + nCNT(3) + nCNT(4) + nCNT(5) + nCNT(6)
の力技や
For i=0 To 6
   nSUM = nSUM + ncnt(i)
Next
でカウントする手もあります。お好みで。

Response.Write "アンケート回答数<b> " & nSUM & "</b>人です"  '*4回答数表示
は、確認の意味も含めて、表示してます。

'ループで回して評価の集計データを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD>" & nCNT(i) & "</TD>"
    '*5 %を計算して、表示する
    Response.Write "<TD>" & (nCNT(i) / nSUM) * 100 & "%</TD></TR>"
Next

人数÷合計数×100で%を計算し、出力してます。

終了ですね。今日は軽かったですね。では、また。

オイ、三流プログラマー
何?
表示を見たのかよ。
http://www.ken3.org/cgi-bin/test/test015-1.asp
を実行すると、 

アンケート回答数 16人です
評価 コメント          人数 % 
6    大変満足           1   6.25% 
5    満足               2   12.5% 
4    まぁまぁ           1   6.25% 
3    どちらとも言えない 4   25% 
2    少し不満           3   18.75% 
1    不満               3   18.75% 
0    かなり不満         2   12.5% 

と表示されるよ。

気になるのが(見た目でNGなのは)、
6.25% 12.5% 25%
と小数点以下の桁数がそろってないよ。
それと、データは右詰になっていて、
数値は左詰のほうがいいのでは?
人数が10だったら、
1
10
と表示じゃマズイでしょ。

/*
 * 3.FormatNumber関数 と <TD ALIGN=Right>
*/

う〜ん、何かないかなぁ。
第一の問題点は小数点以下の桁数問題かぁ、
関数を探すと、
FormatNumber関数ってのが使えそうです。

使い方は
moji = FormatNumber(値,小数点以下の桁数)
で、調整した文字列を返してくれます。

次は右詰かぁ、
えっと、表作りの<TD>タグにALIGNってあるから、
これをRightにするか。

-- test015-2.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>FormatNumber関数 と <TD ALIGN=Right></title>
</head>
<body>
<h2>FormatNumber関数 と <TD ALIGN=Right></h2>
test015-2.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT(10)   'カウンター 変数 10個もいらないけど
dim nSUM       '*1回答の合計数

nSUM = 0       '初期化する

'カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    'Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    'nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
    '*2合計数は無条件にカウントアップ
    nSUM = nSUM + 1
Loop

ts.close  '使ったファイルは閉じようよ

Response.Write "アンケート回答数<b> " & nSUM & "</b>人です"  '*4回答数表示

'Array関数を使用して、評価コメントを初期化
strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _
               "まぁまぁ", "満足", "大変満足")

'結果の表示を<TABLE>タグを使用して表示
Response.Write "<TABLE border=1>"   'border=1で境界線(ワクを表示)
Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD>"
Response.Write "<TD>%</TD></TR>"   '*3 %の見出しを追加
'ループで回して評価の集計データを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD ALIGN=RIGHT>" & nCNT(i) & "</TD>" '*7ALIGN=RIGHT追加
    '*5 %を計算して、表示する
    strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1)  '*6計算と変換処理
    Response.Write "<TD ALIGN=RIGHT>" & strMSG & "%</TD></TR>"
Next

Response.Write "</TABLE>"   '忘れずにテーブルを終わりにする

%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
</body>
</html>
---

ポイントは、得に無く、
'ループで回して評価の集計データを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD ALIGN=RIGHT>" & nCNT(i) & "</TD>" '*7ALIGN=RIGHT追加
    '*5 %を計算して、表示する
    strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1)  '*6計算と変換処理
    Response.Write "<TD ALIGN=RIGHT>" & strMSG & "%</TD></TR>"
Next

*6で、
strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1)  '*6計算と変換処理
と、小数点以下を1桁にしたのと

*7で、
Response.Write "<TD ALIGN=RIGHT>" & nCNT(i) & "</TD>" '*7ALIGN=RIGHT追加
と、<TD ALIGN=RIGHT>を使ってみました。

http://www.ken3.org/cgi-bin/test/test015-2.asp
を実行すると、無事にできたみたいです。

/*
 * 4.まだまだ、メイクが上手じゃないよね
*/

ここ2・3回は、出力ばかり気にしてるけど、
なかなか、上達しないよね。

プログラムもセンスでるけど、
HTMLで結果を表示して、ユーザーに見せるのもセンスが必要ですね。

ASPのテクだけじゃなく、
HTMLの見せ方も平行して覚えないと、
本当にいいページはできないと感じる今日この頃。

/*
 * 5.終わりの挨拶
*/

今回は、
・アンケートには%の項目あるよね
・FormatNumber関数を使って小数点以下の調整
・<TD ALIGN=Right>で右詰の表示
でした。

結果の見せ方も、いろいろな書き方あるので、
人を振り向かせる、夢中にさせるページをみなさんは目指してくださいね。

最強ページへの道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。



ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: