型変換後の計算方法とは?

このQ&Aのポイント
  • テキスト型で保存されている数字をINT型に変換して計算する方法について教えてください。
  • 現在のコードでは常に0が表示されてしまうため、効果的なアドバイスをお願いします。
  • changeYosan関数を使用して、リスト内の予算、実績、伸び率を計算しています。
回答を見る
  • ベストアンサー

型変換を行った後で計算をする方法

DBには、テキスト型で保存している数字があります。 それをJSP側でINT型に変換して、 計算を行いたいのですが、何か良い方法はありませんか? 下記のままだと常に0が表示されてしまいます。 どうか良いアドバイスをお願いします。 function changeYosan() {  var lstYosan = document.form.elements("_uriageYosan");  var lstJisseki = document.form.elements("_uriageJisseki");  var lstNobi = document.form.elements("_nobiritsu"); for(i = 0 ; lstYosan.length > i ; i ++ ){   lstNobi[i].value = lstYosan[i].value.replace(",","") /     lstJisseki[i].value * 100; if(isNaN(lstNobi[i].value)){   lstNobi[i].value = 0; } } }

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2> Q1 this.form this は、この場合自分自身です。 つまり、button エレメント自体を表すオブジェクトということになります。 this.form は、そのthis(自身のエレメント)のプロパティで エレメントが所属するフォームを表すオブジェクトです。 Q2 buttonタグの様にonclickの命令をINPUTの中に実装すればいいのでしょうか? button タグのonclick で処理を呼び出しているのは、単にそのタイミングで処理をさせたかっただけで、このことと「型変換を行った後で計算をする方法」とは無関係です。 好きなようになさればよろしいです。 Q3 その命令より前にINT型の宣言をするのはまずいでしょうか? parseInt は、既に#1で書いたように、(数値として解釈できる)文字列を受け取って整数に変換する処理です。 なので、「,」 のような場合は、あらかじめ取り除いてから渡す必要があります。 例えば parseInt(lstYosan[i].value.replace(",","")) のようにすればいいです。 「,」を小数点として使っているのであれば、 特に整数演算にこだわっているのでなければ 「.」(ピリオド)に置き換えた後 #1 でいうparseFloat を使えばいいと思います。

takahiro_k
質問者

補足

サンプル上での考え方はわかりましたが、 こちらの方でそれを応用しようとすると やはりNULL値となって返ってきます。 値の読み込みが上手くできていないようですね。 ちなみにこう記述しています。 for(i = 0 ; lstYosan.length > i ; i ++ ){   document.form.elements[i].value = parseInt(document.Form._uriageYosan.value.replace(",","")); var lstYosan = document.form.elements[i]; //予算(売上)リスト document.form.elements[i].value = parseInt(document.Form._uriageJisseki.value); var lstJisseki = document.form.elements[i]; //実績(売上)リスト document.form.elements[i].value =document.Form._nobiritsu.value; var lstNobi = document.form.elements[i]; //伸び率リスト lstNobi[i].value = lstYosan[i].value / Jisseki[i].value * 100; //伸び率=予算(売上)÷実績(売上)×100 if(isNaN(lstNobi[i].value)){  lstNobi[i].value = 0; } } JSPでは、配列になっていてデータがグルグル回るので 上記の様に書いてみたのですが、何が原因かわかるでしょうか? 本当に何度も何度も申し訳ありません。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

簡単なサンプルを作ってみました。 ---------------------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=SHIFT_JIS"> <title>Sample</title> <script type="text/javascript"><!-- function calc(f){ var Jisseki = parseInt(f.elements["_uriageJisseki"].value); var times100 = Jisseki * 100; f.result.value=times100; } //--> </script> </head> <body> <form> <INPUT type="text" name="_uriageJisseki" value="1234"> <INPUT type="text" name="result" value=""> <button type="button" onclick="calc(this.form)">100倍</button> </form> </body> </html>

takahiro_k
質問者

補足

ありがとうございます。 考え方はだんだんわかってきました。 度々で申し訳ありませんが、 もう少しだけ教えてください。 Q1 (this.form)というのは、任意でつけた名前ですか?   それとも何かの命令でしょうか? Q2 このプログラムは、テキストチェンジして、  フォーカスを移動すると値が変化するという仕組みですが、  buttonタグの様にonclickの命令をINPUTの中に  実装すればいいのでしょうか? Q3 計算式を記述しているところで小数点を消すために   置き換えの命令が実装されています。   これは、String型に対応しているメソッドだと思いますが、   その命令より前にINT型の宣言をするのはまずいでしょうか?>   lstNobi[i].value = lstYosan[i].value.replace(",","") /    いろいろ質問してしまいましたが、 よろしくお願いします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

整数を表す文字列なら val=parseInt("文字列"); ちなみに 小数なら val=parseFloat("文字列"); で

takahiro_k
質問者

補足

例えば、こんな感じですか? var parseInt("_uriageJisseki"); var lstJisseki = document.form.elements("_uriageJisseki"); これでビルドしてみたんですが、 やはりゼロのままでした。 lstNobi[i].valueが恐らくNULLに なっているんじゃないかと考えているんですが。 ちなみにBODYタグで <INPUT type="hidden" style="width : 50px; text-align:right;" name="_uriageJisseki" value="${Line.売上金額}"> こういう記述をしています。 この値を元に計算します。 方向が少しズレてしまいますが、 JAVAファイルでは、リストを作成し、 そこではテキスト型で数値を入れる仕様です。 やりたい事は、テキストボックスに数値を入れて、 チェンジすると上記のスクリプトが起動し、 隣のテキストボックスの値が変わるという事がしたいのですが、 どうやっても上手くいきません。 何がいけないのでしょうか?

関連するQ&A

  • ファンクションで計算する

    <SCRIPT language="JavaScript">  function changeArariYosan() {   sum();  }  function sum() {   var sumArariYosan = 0;   var lstArariYosan = document.form.elements("_arariYosan");  for(i = 0 ; lstArariYosan.length > i ; i ++ ){   if(lstArariYosan[i].value.replace(",","") == "" |   isNaN(lstArariYosan[i].value.replace(",",""))){ sumArariYosan = 0; break;   }   sumArariYosan += parseInt(lstArariYosan[i].value.replace(",",""),10);//予算(売上) }  document.form.elements("_sumArariYosan").value = addComma(sumArariYosan.toString());  } /*addCommaは、カンマ編集のメソッド*/ bodyの中でこういう記述があります。 <html:text disabled="true" property="_arariYosan" styleClass="hankaku_right_text" onchange="changeArariYosan()" value="${Line.荒利予算}" /> DBより抽出した値で計算をするんですが、 この荒理予算の部分をvalue="1000"にすると きちんと計算を行ってくれます。 しかし、上記の様にDBから抽出する記述に変更すると 計算ができず、0の値が返ってきてしまうのです。 何がいけないのでしょうか?

  • クイズの正解(○×)をテキストボックスに出す方法は・・・

    ラジオボタンで2択のクイズを作成しています。最後に「計算」ボタンを押すと点数は出ます。あと!ラジオボタンの横にテキストボックスを設置して、正解なら「○」、不正解なら「×」と出るようにしたいのですが・・・ ぜひ教えてください。 よろしくお願いいたします。 <SCRIPT language="JavaScript"> <!-- function displayScore() { var score = 0; for(i=0;i<=20;i++){ if(document.form1.elements[i].checked){ score += parseInt(document.form1.elements[i].value); } } document.form2.SCORE.value=score window.alert(" あなたの点数は " + score + " 点です"); }

  • テキストフォームの未入力チェック

    お世話になります。 Javascriptでテキストフォームの入力チェックを行っております。 テキストフォームにはDBから取得した値が入っており、その値を変更して更新できるプログラムを作ろうとしています。 テキストフォームが未入力だった場合に元の値を入れてPOSTリクエストを投げたいのですが方法が分かりません。 (よく見かける未入力だったらアラートを出すというのは出来るのですが・・・) 以下ソースの抜粋になります。 function check(){ for(i=0; i<document.iform1.length;i++){ if(document.form1.elements[i].value==""){ document.iform1.elements[i].valueに元の値を入れたい。 } } <form name="form1" action="updata.php" method="POST"> <input type="button" name ="save" value="更新" onClick="check()"> </form> 以上、ご教示よろしくお願いいたします。

  • 価格計算フォーム作成について

    初心者です。次のような書籍注文フォームを作成しております。 (BODYタグも必要の場合お教え下さい。) CGIは借りており、テーブルの数など変更するとうまく送信できないようです。 フォームへは、各冊数、合計冊数、送料、合計金額の順に入力できるようなっております。また、実際は、書籍(1)、(2)のみ現在使用できるようなっています。 修正しているのですが、動作が正しく動いてくれない状況です、どこを変えたら正しく動作しますでしょうか? 申し訳ありませんが、なかなか解決せずご教示いただけると嬉しいです。 以下コード↓ ------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 6.5.2.0 for Windows"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE>書籍販売 メイン</TITLE> <SCRIPT language="JavaScript"> <!-- //冊数を記述(フォームを使用できるのは書籍(1)、(2)のみ。(3)~(7)は記録として残されている。) function CountBooks() { // var i1 = document.form.書籍(1).selectedIndex; // var i2 = document.form.書籍(2).selectedIndex; // var i3 = document.form.書籍(3).selectedIndex; // var i4 = document.form.書籍(4).selectedIndex; // var i5 = document.form.書籍(5).selectedIndex; // var i6 = document.form.書籍(6).selectedIndex; // var i7 = document.form.書籍(7).selectedIndex; var i1 = document.form1.elements[14].selectedIndex; var i2 = document.form1.elements[15].selectedIndex; var i3 = document.form1.elements[16].selectedIndex; var i4 = document.form1.elements[17].selectedIndex; var i5 = document.form1.elements[18].selectedIndex; var i6 = document.form1.elements[19].selectedIndex; var i7 = document.form1.elements[20].selectedIndex; //送料計算(書籍(1)(単価:300円)のみ適用。1~5冊なら160円、6冊以上なら960円。)) function GetSouryou(i1) { var iSouryou = 0; if (i1 < 1) iSouryou = 0; else if (i1<6 ) iSouryou = 160; else if (i1 < 1000) iSouryou = 960; else iSouryou = 0; } //書籍(1)の単価×冊数を計算 var ikakaku1 = document.form1.elements[14].selectedIndex; * 300; //書籍(2)の単価×冊数を計算   var ikakaku2 = document.form1.elements[15].selectedIndex; * 1000; //合計金額を計算 function GetGoukeiKinGaku(iCount,iSouryou, iKakaku1, iKakaku2) { var iGoukei = 0; iGoukei = (iSouryou * iKakaku2)+ikakaku1; iGoukei = Math.floor(iGoukei); iGoukei = Kanma(iGoukei); document.form1.elements[23].value = iGoukei; } //数値に3桁カンマを追加 function Kanma(iValue) { iValue=new String(iValue); Leng=iValue.length; if(Leng%3 == 0) Atai=Leng/3-1; else Atai=Math.floor(Leng/3); i=3; for(j=0; j<Atai; j++) { iValue=iValue.substring(0,Leng-i)+','+iValue.substring(Leng-i,Leng); Leng++; i++; i+=3; } return iValue; } //--> </SCRIPT> <STYLE type="text/css"> <!-- INPUT{ text-align : left; } .TEXT_RIGHT{ text-align : right; } .style1 {font-size: 2} --> </STYLE> </HEAD> -----------------------------------------------------------

  • evalで数値に変換してる筈なのですが・・・NaN

    今、JavaScriptを勉強中なのですが… Nanと言う表示が出てしまうと言う事は数値じゃないと言う事ですよね? どうしても一人の力では脱出できませんのでお助けください! どなたか是非ご教授よろしくお願いします。 var item=["N-01ネックレス","N-02ネックレス","EA-01イヤリング","KS-01携帯ストラップ"]; var g=[10,15,20,30]; var p=[1000,800,600,600]; function n01(){ var gtotal=0; var guram=0; for(a=0;a<4;a++) { if(document.form.elements[a].checked){ document.form.elements[11+(a*3)].value=item[a]; guram=eval(document.form.elements[12+(a*3)].value=g[a]); price=eval(document.form.elements[13+(a*3)].value=p[a]); }else{ document.form.elements[11+(a*3)].value=""; guram=eval(document.form.elements[12+(a*3)].value=0); price=eval(document.form.elements[13+(a*3)].value=0); } gtotal=gtotal+guram[a]; } document.form.elements[23].value=gtotal; }

  • チェックボックスの選択チェック

    ラジオボタンの選択チェック、セレクトボタンの選択チェックのあとにチェックボックスの選択チェックをしたいのですが、どのように入れればよいのでしょうか。教えてください。 ↓参考までに↓ function check() { var flag=0; if( document.form1.seibetu.length){ flag=1; var i; for(i=0; i<document.form1.seibetu.length; i++) if(document.form1.seibetu[i].checked)flag=false; } if(flag){ alert('性別が選択されていません'); return false; } if(document.form1.nenrei.value=="")flag=true; if(flag){ alert('年齢が選択されていません'); return false; } if( document.form1.Q1.length){ flag=1; var i; for(var i=0; i<document.form1.Q1.length; i++) if(document.form1.Q1[i].checked)flag=false; if(flag){ alert('Q1が選択されていません'); return false; } else {★★★ここに入れたい★★★   ;} } }

  • フォームの要素同士の足し算

    こんにちは。フォームの要素同士の足し算をJavascriptで行おうとしているのですが、要素を文字列と解釈するらしく、うまく演算ができません。。。。 function calcTOTAL(){ var a=10; var b=20; var c=a+b; // この場合は30で演算もOK var sub0; var sub1; if(isNaN(document.forms[0].elements['aaa'].value)){ sub0=0; }else{ sub0 = document.forms[0].elements['aaa'].value; } if(isNaN(document.forms[0].elements['bbb'].value)){ sub1=0; }else{ sub1 = document.forms[0].elements['bbb'].value; } var c=sub0+sub1; // これは文字列同士になってしまう。。。 } どちらも数字でなければ 0 が入って 0+0になるはずなのですが 結果は 00 になってしまいます。 どのように修正したら 数字同士の演算ができるようになるのでしょうか?

  • エラー理由が解らない

    JavaScript初心者ですが 以下の関数でエラーがでるのですが、理由がわかりません。 配列変数は別ソースにてテストしていますが問題なく定義されています。 function total(){ for(var i = 0; i <= ItemQty.length; i++){ window.alert((document.form1.elements[ItemQty[i]].value)*(document.form1.elements[Itemlen[i]].value)*SptVal[i]))  } }

  • 異なるフォームから呼び出したfunctionの計算をしたい

    以下のようなコードがあります <script type="text/javascript"> <!-- function keisan1(FRM){ // ################ 販売価格欄計算 ############### //コンマを外す txt = 5; // テキストボックスの数 for(i=0; i<txt; i++) { if(FRM.elements[i].value != "") { FRM.elements[i].value = FRM.elements[i].value.replace( /,/g, '');} } //数字かどうかチェック for(i=0; i<txt; i++) { if (FRM.elements[i].value.match(/[\D]/g)){ window.alert("今入力した文字が不正です。半角数字で入力してください。"); return(false); // 計算中止 } } //本体価格欄の計算する txt = 4; // 計算するテキストボックスの数 ttl = FRM.hk5.value*0; for(i=0; i<txt; i++) { if(FRM.elements[i].value != "") { ttl += eval(FRM.elements[i].value);} } FRM.hk5.value = ttl-(FRM.hk2.value*2); //コンマ処理 txt = 5; // コンマをつけるテキストボックスの数 for(i=0; i<txt; i++) { if(FRM.elements[i].value != "") { FRM.elements[i].value = FRM.elements[i].value.replace( /,/g, '').replace( /((?:^[-+])?\d{1,3})(?=(?:\d\d\d)+(?!\d))/g, '$1,');} } }//############## 販売価格計算ここまで ############### こういった感じのものが 4つあります で それぞれの合計額を 最後にたして総合計したいのですが まず それぞれの呼び出しが別々のフォームになっていまして HTMLは <form name="rei1"> onclick="keisan1(this.form)" </form> と言う感じで keisan1から4まで作りました また、HTMLもフォーム名 rei1からrei4まであります 総合計計算をするときに onclick="sougoukei()" として念のため各項目の合計計算(小計を出す感じです)し直してから 各項目をたして総合計にしたいのですが function sougoukei(){ keisan1(); keisan2(); keisan3(); keisan4(); ここから各小計をたして総合計を出す } としたいのですが うまくいきません ( )の中に何か書かないといけないようなんですが this.form でも合計が出ない FRMとうっても  FRM.elements[...]はnullかオブジェクトではないと言う感じのエラー が出ます それぞれの小計計算はうまく動いています。 何をどうしたらうまくいくのかよく分かりません どなたかご教授お願いします よろしくお願いします

  • CFLOOPで計算させたいのですが(2)

    先ほどとの関連になりますが、 <SCRIPT LANGUAGE="JavaScript"> <!--JavaScript function TotalSum(i) { var evalStr = eval("document.sum" + i); with(evalStr) { if(!isNaN(text1.value) && !isNaN(text2.value) && !isNaN(text3.value) && text1.value && text2.value && twxt3.value); { text4.value = eval(text1.value) + eval(text2.value) - eval(twxt3.value); } if( !isNaN(text5.value) && !isNaN(text6.value) && text5.value && text6.value); { text7.value = eval(text4.value) + eval(text5.value) + eval(text6.value); } } } // --> </script> </head> <body> <TABLE BORDER="1"> <FORM name="myform" action="url" method="post" onSubmit="TotalSum(' + i + ');return false;"> <cfloop index="i" from="1" to="10"> <TR> <TD><input type="text" name="text1" onChange="TotalSum('+i+')" value="0"></TD> <TD><input type="text" name="text2" onChange="TotalSum('+i+')" value=""></TD> <TD><input type="text" name="text3" onChange="TotalSum('+i+')" value="0"></TD> <TD><input type="text" name="text4" onChange="TotalSum('+i+')" value="0"></TD> <TD><input type="text" name="text5" onChange="TotalSum('+i+')" value=""></TD> <TD><input type="text" name="text6" onChange="TotalSum('+i+')" value=""></TD> <TD><input type="text" name="text7" onChange="TotalSum('+i+')" value="0"></TD> </TR> </cfloop> </form> </TABLE> </body> また、見当はずれなこと言っていたらすみません。

専門家に質問してみよう