- ベストアンサー
JAVAservlet MySQLでの少数点の表示について
- プログラムでJAVAからMySQLにアクセスして条件にあった項目を抜き出すとき、JSPで表示するとMySQLのSUM関数で合計した値に少数点がついてしまいます。
- JSPで表示したときはString型で表示しており、抜き出した情報はArrayListに格納されています。
- コマンドプロンプトで同じセレクト文を入力して表示したところ、少数点は表示されませんでした。なぜJSPのときは少数点が表示されるかわかりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>ANo.2さん >TEXT型のような文字列型では >SUM関数は使用不可ではありませんか? どうやらMySQLのSUM関数では、文字列型から数字への変換が自動で行われるようです。(参考URLを参照) 自分で試していないので、確実にそうだとはいえませんが。。 >bankensanさん JavaBeanにて問い合わせ+結果格納→格納した結果をJSPへ てことでしたら、結果を格納する変数がfloat型になっているのではないでしょうか? 以下、文字列をint型の数値に変換するソースを組んでみました。 結果は"12"とただしく表示されます。 <html> <head></head> <body> <% String num_str = "10.6"; int num_i = 0; int j = 2; num_i = Float.valueOf(num_str).intValue(); %> 10 + 2 = <%= num_i + j %> <br> <br> </body> </html>
その他の回答 (4)
- t032904
- ベストアンサー率83% (5/6)
>fortranxp SQLに、castする関数なんてあるんですね! 勉強になります。 ただ、bankensanさんの情報によると、 >>ちなみにSUM関数を使っているフィールドのデータ型はtext型です >>データは数字しか入りません(1や10など) とのことなので、DBに入っているデータは整数(を文字として格納している)になってるんじゃないですかね? float flt = 5; としてコンソール表示させると5.0となることから、やはり問題はSQL文を発行した後の格納変数にあるのではないかと。。
- fortranxp
- ベストアンサー率26% (181/684)
そうであればSQL文を直して select no,sum(num) from ~ を select no,CAST(sum(num) as SIGNED INTEGER)) from ~ か select no,CAST(sum(CAST(num as SIGNED INTEGER)) as SIGNED INTEGER) from ~ にしたらどうでしょうか?
- fortranxp
- ベストアンサー率26% (181/684)
TEXT型のような文字列型では SUM関数は使用不可ではありませんか? 仮にDBのテーブル定義をint型に 変更したらうまくいきませんか?
- t032904
- ベストアンサー率83% (5/6)
単純に整数にしたいということでしたら、sevlet側で値を渡す前に一旦Integer型へキャストし、その後にString型への変換をかけてやればいいと思います。 Integer total_int = (Integer)total_float; String total_str = Ingeter.toString(total_int); >JSPで表示したときはString型で表示しています。 >例 (String)row.get(0) といった感じです。 ServletからJSPに渡す方法というと、request.getAttribute('hoge')しか浮かばないのですが・・・ もしや、問い合わせも表示も同じJSPファイル内で行ってますか?
補足
説明不足ですいません。 まずはじめにHTMLからフォームで情報をサーブレットに送り、 そのサーブレットがselect文の条件、テーブル、などを決めて JAVABeansにおくり、そこでSQLにアクセスをして 結果をJSPに送るといった感じです。 JSPで表示したときにSUM関数を使ったフィールドの値に小数点が付いています。(この時点ではString型になっている) それをint型に直そうとするとエラーになってしまいます。 多分小数点が付いているからだと思うのですが・・・ 今現在では1桁か2桁しか絶対出ないプログラムなので文字列の数を数えて(1.0なら3、10.0なら4)3文字なら1文字抜き出してそれをintに変える、4文字なら2文字抜き出してintに変えるというプログラムになってしまっています。 なおintにする理由はJSPにあるint型の変数を使って計算させるためです。
補足
みなさん色々知恵を絞って考えてくださってありがとうございます。 こんかい回答No.2のfortranxpさんにいわれたようにDBテーブルのデータ型をint型にしたものを作りテストしたところ小数点がなくなりました。 少しJSPでもらったときのプログラムを見せますね。 ArrayList tbl = DBbean.getTbl(); ArrayList row = null; for(int i=0;i<tbl.size();i++){ row = (ArrayList)tbl.get(i); if("aa".equals((String)row.get(0))){ String a_num = (String)row.get(1); //if("3".equals(a_num.length())){ // a_num = a_mnum.substring(0,1); //}else{ // a_num = a_num.substring(0,2); //} int int_a_num = Integer.parseInt(a_num); aa_num = aa_num-int_a_num; } if("bb".equals((String)row.get(0))){ String b_num = (String)row.get(1); //if("3".equals(b_num.length())){ // b_num = b_num.substring(0,1); //}else{ // b_num = b_num.substring(0,2); //} int int_b_num = Integer.parseInt(b_num); bb_num = bb_num-int_b_num; } if("cc".equals((String)row.get(0))){ String c_num = (String)row.get(1); //if("3".equals(c_num.length())){ // c_num = c_num.substring(0,1); //}else{ // c_num = c_num.substring(0,2); //} int int_c_num = Integer.parseInt(c_num); cc_num = cc_num-int_c_num; } } 今回int型にしたことにより//スラッシュの部分が要らなくなり、すっきりしました。 皆さんありがとうございました。これからもがんばってJAVAを習得しようと思います。 また、参考書などを見ても解決しないことがあればよろしくお願いします。