このプログラムを改善したいのですが・・・



0   名前: nin : 2006/07/25(火) 18:48  ID:kpTfZhhY
度々すいません、ninです。
下記のプログラムを改善したいのですが、どうすればよいのでしょうか?

 @単価(テキストボックス)の欄に、先頭文字を0にして数字を入力すると、合計で正しい解が得られない。
   例) 単価→044  個数→2 合計(単価×個数)→072
 A品名のテキストボックスをを空欄にしてフォーカス移動した場合には、
  アラートででエラーメッセージを表示させたい。
 B<input>でkeisan()関数を呼び出す時、引数をthis.form以外にしたい。
 すみませんがよろしくお願いいたします。

<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 Comma(strA)
{
var strA = new String(strA);
var strALeng = strA.length;

if(strALeng%3 == 0){
sep = strALeng/3-1;
}else{
sep = Math.floor(strALeng/3);
}

i=3;
for(j=0; j<sep; j++){
strA = strA.substring(0,strALeng-i) + "," + strA.substring(strALeng-i,strALeng);
strALeng++;
i++;
i+=3;
}
return strA;
}

//カンマを削除するための関数
function DeComma(strA){
var strA = new String(strA);
var strB = new String();
strALeng = strA.length;

for(j=0; j<strALeng; j++){
if (strA.charAt(j) != ",")
{
strB=strB + strA.charAt(j);
}
}
return strB;
}

//合計(単価×個数)を求めるための関数
function keisan(num)
{
try{
var A = DeComma(num.tanka.value);
var B = DeComma(num.kosuu.value);
num.goukei.value = Comma(eval(A) * eval(B));
num.tanka.value = Comma(A);
num.kosuu.value = Comma(B);

}catch(e){
num.goukei.value = "Err";
alert("正しい数値を入力してください!");
}
finally{
}
}

//-->

</script>

<body onload="document.form1.hinmei.focus()">
<table>
<form name="form1">
<tr>
<td>品名</td>
<td><input type="txt" name="hinmei" style="ime-mode:active;" maxlength="20" size="40"></td>
</tr>

<tr>
<td>単価</td>
<td><input type="txt" name="tanka" style="ime-mode:inactive;" class="textbox" onBlur=" keisan(this.form)" maxlength="6"></td> </tr>

<tr>
<td>個数</td>
<td><input type="txt" name="kosuu" style="ime-mode:inactive;" class="textbox" maxlength="2" ></td>
</tr>

<tr>
<td>合計(税抜き)</td>
<td><input type="txt" name="goukei" style="ime-mode:inactive;" class="textbox" value="" ></td>
</tr>

<tr>
<td></td>
<td><input type="button" name="touroku" value=" 登録 " onClick="keisan(this.form)" ></td>
</tr>
</form>
</table>
</body>
</html>

    

1   名前: かふぇおれ : 2006/07/25(火) 18:48  ID:Ji0blfRq
え〜と、このscriptはご自分で書かれましたか?
もし、どなたかに師事なされたのなら、その方に伺う方が安全ですよ。

(1) 先頭文字を0にして数字入力すると、JavaScript では8進数として認識されてしまいます。
(2) 品名のテキストボックスの値は hinmei.value です。
  これが「もし空欄だったら」と入れれば良いのです。サンプルはご自身のscript の中にありますよ。
(3) 引数を与えているのは、関数内での簡素化の為です。
  エレメントを参照するか、oElement = document.getElementById("id1");
  タグ名から要素リストを参照するか、oElements = document.getElementsByTagName("form");
  name 属性で指定した名前で要素リストを参照するか、oElements = document.getElementsByName("goukei");

で、いかがでしょう。

# 古い覚え方をしてしまったので、try構文って使った事ありませんでした。
# 現状では浸透しているものなのでしょうか。

2   名前: Pid : 2006/07/25(火) 18:48  ID:yr31S3VU
余談ですが,

> try構文って……現状では浸透しているものなのでしょうか。

NN4 だとエラーになりますが,最近のブラウザであればほぼサポートしています。
http://www.interq.or.jp/student/exeal/dss/ref/jscript/statement/catch.html

たとえば,最近いわゆる Ajax が流行していますが,IE は ActiveX 機能がオフの場合に new ActiveXObject するとエラーを吐きますので,必ず try..catch しておかねばなりません(style.filter をいじる場合も同様です)。

ただ,>>0 で try..catch する必要性が今一つ分かりませんが……。



あと,>>0 は i,j が var 宣言されておらず,グローバル変数になっていますので注意して下さい。ついでに,丸付き数字はなるべく使用しないで下さい。

3   名前: かふぇおれ : 2006/07/25(火) 18:48  ID:Ji0blfRq
# あははは、>>1 の様な書き方をすれば、
# きっとPid さんがレスをくれるだろうと思っていました。

>>0 nin さん、余談で使ってすみません。

try..catch..finally はjs1.3(だっけ?)からの割り込み例外処理に使用する構文ですので、この場合に必然性はないですよ。
勿論答えは一つでは無いし、どんな書き方も作成者の自由ではありますので、
nin さんが想定している利用者に不具合が出なければ構わないのですけど。

丸付き数字(やローマ数字・単位記号)はWIN機種依存(PC-9801外字だっけ?)です。
OSによって文字コードが異なる為、ウェブ上での使用は控えられた方が懸命です。

4   名前: Pid : 2006/07/25(火) 18:48  ID:GOE45W6U
釣りだったのかー!!!

これだけだと何なので,

>>0
> 先頭文字を0にして数字を入力すると、合計で正しい解が得られない

eval ではなく parseInt を調べてみて下さい。

5   名前: かふぇおれ : 2006/07/25(火) 18:48  ID:MRwTGpOM
あ…Pid さん、ごめんなさいっ!
釣りのつもりは無かったのですが、補足説明をして頂けると嬉しいなとか考えたもので。

で、nin さん。
http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi?mode=view&no=544
の流れから指向をお変えになったのは理由がおありでしょうか。
もしさしたる理由が無いのなら、多少冗長でも解りやすい構文にした方が良いですよ。

6   名前: 匿名 : 2006/07/25(火) 18:48  ID:kpTfZhhY
お礼遅くなりました、ninです。
当方今独学で勉強している超初心者でして、コピーペーストで貼り付けたソースなので、イマイチ分かってないんですよね・・・
とにかくカンマ区切りが難しくて、参ってます。
今回も皆さんありがとうございました!!!

一覧へ戻る