カンマを外して、総計を出したいのですが・・



0   名前: nin : 2006/08/02(水) 12:23  ID:kpTfZhhY
いつもお世話になっております、ninです。
ここまでなんとか理解しながら作成しましたが、ここから先がお手上げです。
カンマを外して、総合計を出したいのですが、どうすればよいのでしょうか?
カンマ外しの呼び出し方法もわかりません。
どうぞよろしくお願いします。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<style type "text/css">
<!--
.textbox{text-align:right;}
-->
</style>

<title>HTMLサンプル kadai</title>
</head>
<script language="JavaScript">

<!--
function keisan(frm){
for(i=0; i<2; i++){
frm.elements[4*i+3].value =
frm.elements[4*i+1].value * frm.elements[4*i+2].value;
}
}

function soukei(frm){
a = 0;  
for(i=0; i<2; i++){
a += parseInt(frm.elements [4*i+3].value);
}
frm.sougoukei.value = a;
}

//コントロール(テキストボックス)で受け取ったものを値に変換するための関数
function ctrl(ctr){
ctr.value = commas(ctr.value);  //値ではなくコントロール(テキストボックス)で受け取ったので、
 //Commas関数でカンマが付いた文字列をctr.valueに代入する。
}

//カンマを付加するための関数
function commas(valueA){

a = new String(valueA); //受け取った値を文字列として、aに代入
leng = a.length;  //受け取った値の文字数(a.length)をlengに代入
if(leng%3 == 0){  //もし入力文字が3で割り切れる場合、カンマの数はleng/3-1で表される。
atai = leng/3-1;  //そのカンマの数をataiに代入

}else{  //入力文字が3で割り切れない場合、入力文字を3で割った解の小数点
atai = Math.floor(leng/3);//を切捨てた数字がカンマの数となり、それをataiに代入
}
i=3;
for(j=0; j<atai; j++){  //カンマの数だけカンマを付加するためのループ処理
valueA=a.substring(0,leng-i)+','+a.substring(leng-i,leng);//文字列を分割し、カンマを付ける。
leng++;
i++;
i+=3;
}
return valueA;  
}
-->

</script>
<body>
<table>
<form name="form1">
<tr><td>品名</td><td>単価</td><td>数量</td><td>合計</td></tr>

<tr><td><input type="txt" size="40" name="hinmei"></td>
<td><input type="txt" size="20" class="textbox" name="tanka" onblur="ctrl(document.form1.tanka)"></td>
<td><input type="txt" size="20" class="textbox" name="suryo" onBlur="keisan(this.form); ctrl(document.form1.suryo);"></td>
<td><input type="txt" size="20" class="textbox" name="sum"></td>
</tr>

<tr><td><input type="txt" size="40" name="hinmei1"></td>
<td><input type="txt" size="20" class="textbox" name="tanka1" onblur="ctrl(document.form1.tanka1)"></td>
<td><input type="txt" size="20" class="textbox" name="suryo1" onBlur="keisan(this.form); ctrl(document.form1.suryo1);"></td>
<td><input type="txt" size="20" class="textbox" name="sum1"></td>
</tr>


<tr><td></td><td></td><td><input type="button" size="20" name="goukei" value="計算" onClick="soukei(this.form)"></td>
<td><input type="txt" size="20" class="textbox" name="sougoukei" ></td>
</tr>

</form>
</table>
</body>
</html>

1   名前: かふぇおれ : 2006/08/02(水) 12:23  ID:Ji0blfRq
http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi?mode=view&no=544
の>>4 でm035さんに頂いた回答では、参考になりませんでしたか?

再掲:
function keisan(){
var f1=document.forms["form1"].elements;
var t_val=f1["tanka"].value.split(",").join("")-0;
var k_val=f1["kosuu"].value.split(",").join("")-0;
f1["goukei"].value=setComma(t_val*k_val+"");
}


2   名前: Pid : 2006/08/02(水) 12:23  ID:JewatAma
>>0
HTML が致命的に間違っていますので,http://openlab.ring.gr.jp/k16/htmllint/htmllint.html でチェックして下さい。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>サンプル</title>

<style type "text/css">
.calc-form input { text-align: right; }
input[readonly] { background: #fcc; }
</style>

<script type="text/javascript">

// カンマを付加した文字列を返す
function encommas (value) {
    return String (value).replace (/((?:^[-+])?\d{1,3})(?=(?:\d\d\d)+(?!\d))/g, '$1,');
}

// カンマを外した文字列を返す
function decommas (value) {
    return value.replace (/,/g, '');
}

// 入力チェックしてカンマ付加する
function checkAndSetCommas (control) {
    var v = control.value;
    
    if (v.charAt (v.length - 1).match (/\d/))
        control.value = encommas (decommas (v));
}

////////////////////

// 表計算のメイン関数
function keisan (control) {
    getHorizonalSum (control);
    getVerticalSum (control.form.elements);
}

// 単価×数量を計算する
function getHorizonalSum (control) {
    var index = parseInt (control.name.charAt (control.name.length - 1));
    var e = control.form.elements;
    var c = {
        tanka : e['tanka' + index],
        suryo : e['suryo' + index],
        sum   : e['sum'   + index]
    };
    
    // 暗黙の型変換で文字列→数値→文字列になっていることに注意
    c.sum.value = encommas (decommas (c.tanka.value) * decommas (c.suryo.value));
    
    checkAndSetCommas (c.tanka);
    checkAndSetCommas (c.suryo);
}

// 総計を計算する
function getVerticalSum (controls) {
    var result = 0;
    var c, i = 0
    
    // 番号が切れた時点で計算終了というバグを抱えているので注意
    while (c = controls['sum' + i++])
        result += parseInt (decommas (c.value));
    
    controls['sougoukei'].value = encommas (result);
}

</script>

<form action="#">
<table summary="左から品名,単価,数量,合計。" class="calc-form">
<thead>
<tr>
<th>品名</th>
<th>単価</th>
<th>数量</th>
<th>合計</th>
</tr>
</thead>

<tfoot>
<tr>
<th colspan="3">総計</th>
<td><input type="text" name="sougoukei" value="0" readonly="readonly"></td>
</tr>
</tfoot>

<tbody>
<tr>
<td>品 A</td>
<td><input type="text" name="tanka0" value="0" onkeyup="keisan (this); "></td>
<td><input type="text" name="suryo0" value="0" onkeyup="keisan (this); "></td>
<td><input type="text" name="sum0" value="0" readonly="readonly"></td>
</tr>

<tr>
<td>品 B</td>
<td><input type="text" name="tanka1" value="0" onkeyup="keisan (this); "></td>
<td><input type="text" name="suryo1" value="0" onkeyup="keisan (this); "></td>
<td><input type="text" name="sum1" value="0" readonly="readonly"></td>
</tr>
</tbody>

</table>
</form>


本番ならこんな組み方は絶対にしませんが,まあ練習程度に。

3   名前: Pid : 2006/08/02(水) 12:23  ID:JewatAma
あ,小数を考慮するなら parseInt じゃなく parseFloat でした。

4   名前: nin : 2006/08/02(水) 12:23  ID:kpTfZhhY
大変遅くなりました!ninです。
自宅がネット環境ではないものですから・・・
すごいプログラムをありがとうございました。
自分なりに分解して、消化できるようにしてみます!
また、htmlに関してもご指摘していただき感謝しております。
ありがとうございました。

一覧へ戻る