数字の大小チェック

[上に] [前に] [次に]
あつし [E-Mail] 1999/12/06(月) 20:06:37
何回も質問させていただいて申し訳ありません。
テキストボックスから数字の大小(範囲)をチェックする
Javascriptはどのようになるのでしょうか。
自身で作成してみましたが、うまく動きませんでした。

<SCRIPT LANGUAGE="JavaScript">
<!--
function kakunin() {
if ((document.form1.kiboukai1.value)>6){
alert("\希望回数が不正です。");
document.form1.kiboukai1.focus();
return(false);
}
// -->

</SCRIPT>

zizz... [HomePage] 1999/12/06(月) 21:50:15
document.form1.kiboukai1.value
の型変換で問題が起こっているのだと思います。
時間がないので確認はしていませんが。
document.form1.kiboukai1.value
の値は文字列なので、数字である6と比較する場合、自動的に型変換が行われます。

あつし 1999/12/07(火) 00:32:10
ご指導ありがとうございます。
型変換をさけるためには、
var txt=document.form1.kiboukai1.value
とやって、「txt」について、数字の判定をすればいいのでしょうか。

J.Naka 1999/12/07(火) 00:59:15
document.form1.kiboukai1.value これを数値として判断したわけですから、これを数値に変化すれば良いわけです。今の状態は文字だと思います。試してないですが、下↓でいけると思う。

intD = document.form1.kiboukai1.value - 0;
if (intD>6){

ゼロを引くのが味噌です。足すと文字列の連結になります。
とほほWWWの「JavaScriptの文字列と数値について」(wwwjsz01.htm)に解説されてます。

その他にもJavaScriptには文字←→数値の変換は色々便利な関数がありますよ。

おまけ:
JavaScriptは数値と文字列の数字が混同しやすいので、自分は変数名の先頭に str があれば文字しか入れないとか、int lng は数値のみとか、一文字変数名は数値オンリーとか、プログラムが少し長くなると変数名を工夫しないと、すぐワケワカメになってしまいます、、、自分の頭が(笑)

あつし 1999/12/07(火) 10:15:49
[[解決]]
ありがとうございました。
解決いたしました。

J.Naka 1999/12/07(火) 12:34:27
先頭行の
>これを数値として判断したわけですから

>これを数値として判断した[い]わけですから
[い]が抜けているよ(笑)>J.Nakaさん

#誤字はまぁ前後の文脈で察することは出来るけど、
#脱字があると意味が正反対&意味不明になる。
#むぅぅぅ、脱字を防ぐ良い方法はないものか(^^;

とほほ 1999/12/08(水) 00:38:54
これって、本当に型変換の問題なんですっけ?

JavaScriptの型変換は妙な仕様で、次のように、+演算子では文字型が、
>演算子では数値型が優先されます。

 数値 + 数値:数値演算 12 + 3 → 15
 数値 + 文字:文字演算 12 + "3" → "123"
 文字 + 数値:文字演算 "12" + 3 → "123"
 文字 + 文字:文字演算 "12" + "3" → "123"

 数値 > 数値:数値演算 12 > 3 → 真
 数値 > 文字:数値演算 12 > "3" → 真
 文字 > 数値:数値演算 "12" > 3 → 真
 文字 > 文字:文字演算 "12" > "3" → 偽

今回のパターンは「文字 > 数値」のケースで、数値演算が行われるた
め、型変換に関しては問題無いと思います。それより、if文の { ... }
が閉じていないのが原因ではないでしょうか。

> 確認はしていませんが。
> 試してないですが、下↓でいけると思う。

私の推測が外れていれば、赤っ恥なのを覚悟してお願いしますが(*^^*)、
最近、ラウンジの書き込みが過剰気味になってきているので、量より質
のある回答をお願いいたしますね。>皆様。

J.Naka 1999/12/08(水) 01:41:28
>型変換に関しては問題無いと思います。
>それより、if文の { ... }が閉じていないのが原因ではないでしょうか。
その通りです。今、確かめてみました(^^;
#しかし、括弧の付け忘れってエディタでチェックすれば、
#普通ないのだが、、、、伝々。

>量より質のある回答をお願いいたしますね。>皆様。
もっともな事だと思います。反省中 (_ _)

zizz... [HomePage] 1999/12/08(水) 21:14:40
括弧の話が出てくる前に解決しているのだけど、どうなっているのだろう?
普通は括弧が抜けていたらSyntax Errorがでるはず。
うまく動かないとあるけれど、具体的な症状を書いてくれれば、こちらも混乱しなかったはず。(言い訳)

Relational operator ">" (The greater-than operator)の動作の詳細ですが、ECMAScript 2の仕様書で調べてみました。
x > y について、
1. ToPrimitive(x) ... この場合 xはStringなのでそのままの値がかえってくる
2. Toprimitive(y) ... この場合 yはNumberなのでそのままの値がかえってくる
3. ToNumber(1の結果) ... この場合 1の結果はStringなので複雑な演算が待っています(笑)
4. ToNumber(2の結果)... この場合 2の結果はNumberなのでそのままの値がかえってくる
5. 3の結果がNaNだったらundefinedをかえす
6. 4の結果がNaNだったらundefinedをかえす ... この場合NumberでありNaNでない
7. 3の結果と4の結果が同じならfalseをかえす
以下略

ここで問題は、3のToNumber(String)の処理です。
しかしこの説明に3ページ近く費やされているので、適当に眺めたところ、
素直に文字列を数字に変換しているようです。(自信なし)
ただし、解釈できない場合はNaNをかえします。

undefinedはBooleanで解釈するとfalseです。

関係ないと思われる部分を一部省略しましたが、こんな感じです。

これを踏まえてあつしさんのスクリプトを検証します。

<script type="text/javascript">
<!--
function kakunin() {
if ((document.form1.kiboukai1.value)>6){
alert("\希望回数が不正です。");
document.form1.kiboukai1.focus();
return(false);
}
}
//-->
</script>

<form name="form1">
<input type="text" name="kiboukai1">
<input type="button" value="click" onclick="kakunin()">
</form>

document.form1.kiboukai1.valueの値は、ユーザーが入力した文字です。
ユーザーはテキストフィールドに入力可能な文字なら、なんでも入力する可能性があります。
"2", "8"など以外にも、"-4", "0.9", "foo", "", " ", "あ"なども入力可能だということです。
(document.form1.kiboukai1.value)>6
は、"foo", "", " "のときfalseです。
例えば、"foo"はNaNで、式の評価はundefinedでfalseです。

結局、" ", "foo"などは「不正でない希望回数」となります。

これで型変換の問題ということになりますよね? >とほほさん

zizz... [HomePage] 1999/12/08(水) 21:24:15
どうでもいい人にはどうでもいい訂正。
> document.form1.kiboukai1.valueの値は、ユーザーが入力した文字です。
document.form1.kiboukai1.valueの値は、ユーザーが入力した文字列です。

J.Naka 1999/12/08(水) 21:49:51
zizz...さん、こんちわ。
わたくしは、とほほさんではありませんが、少し感じた事を少々(^^;

数値文字が入力される事を前提のコードでは、最初に作る物としては、あつしさん提示のスクリプトで充分ではないかと思います。
4バイト超の数値文字列あるいは数値以外の文字の入力に備えるのは、いわゆる例外処理(ユーザーインターフェイス観点)の範疇に入ってくるので、少し上級レベルな問題となるのではないかと思う。
今回のようなレベルの場合にそこまで視点を広げるのは「良い」のか「やぶへび」になるのか難しいところだと思う。

#自分の書いてるものは一応の例外処理はしてるつもりではあります。

zizz... [HomePage] 1999/12/08(水) 22:08:19
どうなんでしょうかね? > J.Nakaさん
上のスクリプトを最初に見たとき、「hogeとか入力したらやばいんしゃないの?」
と思ったのですが、文字列を数値に変換する処理の詳細に自信がなかったので、
適当に答えておいて、あとは誰かに任せようと、考えていました。

誰も答えていなかったのと、期待通り型変換の話になったのと、とほほさんに「量より質」と言われたことの三つの理由で、上の書き込みをしました。

あつしさん
ユーザーに好き勝手に入力させると後の処理がややこしいので、
SELECTタグでユーザーにあらかじめ決められた範囲から選ばせる というのはいかがですか。

あつし 1999/12/09(木) 09:27:01
皆さんのお話を拝見して、その内容について行けていないのですが。。。
まず、「うまく動かなかった」ということについてですが、
何のエラーも出ずに、次の処理(具体的にはメール発信)へ
処理が移りました。
zizz様のご指摘のとおり、selectタグ等を使い「デジアナ」感覚
(表現が非常に古いです。。。。)で
作成を行いたいと思います。
また、検証していただいたソースについても、テストを試みたいと
思います。
非常に参考になるお話をありがとうございます。

[上に] [前に] [次に]