![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
(1/2)
文末のように、よくある(1) 和暦→西暦、(2) 西暦→和暦 変換スクリプトで、
nullだったり半角数字だったりした場合のエラー処理として、
(1) は、次のようにしたらOKでした。
try{
alert("西暦"+wareki+"年");
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}
しかし、(2) は同様に次のようにしても、nullや半角英字だったりすると
スクリプトエラーになってしまいます(例外処理されない)
try{
alert(seireki1+seireki+"年");
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}
どこに誤りがあるのでしょうか?よろしくお願い致します。
No.5ベストアンサー
- 回答日時:
>ということでしょうか??
そうです。
try{
wareki=eval(myform.wareki.value);
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}
のtryでwarekiの実体ができているので
それが失敗したら、warekiがないということになりますよね。
1つには、こういうことに関係なく
var wareki;
で宣言しておくことですが、
宣言されていないというエラーにはならなくても、
値が無意味な値nullとか0になるので、
これもおかしいですね。
エラーが起こるということは、その変数の値が無効(というかそれを調べたかったのだから)なのだから、それを用いた計算はすべきではありませんよね。
結局の処、エラーが起こったことを何らかの変数に記録して、ifでくくるようなことになるのかもしれませんが、そんな風にやるくらいなら
var wareki=parseInt(myform.wareki.value);
if(wareki==NaN){//数値ではない
alert("エラーです。入力した値を確認して下さい。");
} else {
//処理
}
と素直に書いた方が良いような気がします。
(もともとの質問文の意図とは異なるものになってしまうので、今までは書きませんでしたが)
BLUEPIXYさん、いつもお世話になります。
試してみたところ、「西暦NaN年」になるってわけですね。
スクリプトエラーにならないだけでも本当に(精神衛生上)嬉しいです。
とりあえずご教示の方法でしばらく運用してみます。
本当にありがとうございました。
No.6
- 回答日時:
#5でparseInt("123D")とかの場合はエラーにはならずに123になってしまうようです。
これもチェックするには、求めた数値をもう一度文字列にして同じかどうかとかチェックする必要があります。
No.4
- 回答日時:
>どこと入れ替えたら
wareki = myform.wareki.value;
を
try{
wareki=eval(myform.wareki.value);
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}
に
エラーの時は、下に抜けないようにしないとダメかも。
seirekiも同様ですね。
この回答への補足
BLUEPIXYさん、たびたびのご教示ありがとうございます。
早速入れ替えてみましたが
alert( "エラーです。入力した値を確認して下さい。" );
が表示された「後で」スクリプトエラーが起こります。
(warekiが宣言されていない、と)
これがおっしゃる、
> エラーの時は、下に抜けないようにしないとダメかも。
ということでしょうか??
No.3
- 回答日時:
(2)の場合、「seireki1」が宣言されていないからでしょう。
「seireki1」という変数は、西暦の年数を範囲チェックする
if文の条件のいずれかにヒットしたときは宣言されていますが
どの条件にも該当しなかったときは、宣言処理を通りません。
(1)の方は、かならずwarekiの宣言を通っていますし、
switchのdefaultによって、どこにも該当しない場合の
対処があります。
この回答への補足
osumitanさん、アドバイスありがとうございます。
状況についてはよく理解できました。
(2) の方もswitchにすることはできないので(^^:
ちょっと途方に暮れているのですが。。。
でも勉強になりました。ありがとうございます。
No.2
- 回答日時:
質問文の例の場合、例外は起こらないです。
#1のプログラムで、
西暦に変換する部分で
eval時に
eval ( wareki+"+ 1988");
はエラーを起こしますが
和暦に変換する部分では、
西暦の時と違ってifの条件ではじかれてしまうので
eval時のエラーにはならないです。
多分そういうことかと思います。
入力が数字に評価できないようなものというのをチェックするためには、このプログラムのように計算に含めないで
try{
wareki=eval(myform.wareki.value);
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}
の様にやるといいと思います。
この回答への補足
BLUEPIXYさん、いつもお世話になっております。
恥ずかしいことを聞いて恐縮ですが、
ご教示の下記の部分はどこと入れ替えたら
よろしいでしょうか??
try{
wareki=eval(myform.wareki.value);
} catch(e) {
alert( "エラーです。入力した値を確認して下さい。" );
}
ほんとすみませんがアドバイスいただけますと幸いです。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_08.png?5a7ff87)
No.1
- 回答日時:
すみません、質問者です。
ソースは下記です。<html><head>
<SCRIPT LANGUAGE="JavaScript">
<!--
function myCalc(myform) {
if(myform.Radio[0].checked) {
myselect = myform.select1.selectedIndex;
wareki = myform.wareki.value;
switch(myselect)
{
case 0:
wareki = eval ( wareki+"+ 1988");
break;
case 1:
wareki = eval ( wareki+"+ 1925");
break;
case 2:
wareki = eval ( wareki+"+ 1911");
break;
case 3:
wareki = eval ( wareki+"+ 1867");
break;
default:
wareki = "エラー";
break;
}
alert("西暦"+wareki+"年");
}
if(myform.Radio[1].checked) {
seireki = myform.seireki.value;
if (seireki>=1989)
{
seireki = eval ( seireki+ "-1988" );
seireki1= new String( "平成" );
}
if (seireki>=1925)
{
seireki = eval (seireki+"-1925");
seireki1=new String("昭和");
}
if (seireki>=1911)
{
seireki = eval (seireki+"-1911");
seireki1=new String("大正");
}
if (seireki>=1867)
{
seireki = eval (seireki+"-1867");
seireki1=new String("明治");
}
alert(seireki1+seireki+"年");
}
}
//-->
</script>
</head>
<body>
<form method="post" id="form3">
<input type="radio" name="Radio" value="ws" id="rdo1" checked> 和暦→西暦
<select name="select1" id="select1">
<option value="heisei">平成</option>
<option value="syowa">昭和</option>
<option value="taisyo">大正</option>
<option value="meiji">明治</option>
</select>
<input name="wareki" type="text" id="wareki">年 /
<input type="radio" name="Radio" value="sw" id="rdo2">和暦←西暦
<input name="seireki" type="text" id="seireki"> 年<br>
<input type="button" name="Submit" value=" 変換 " onClick="myCalc(this.form)">
</form>
</body></html>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- Excel(エクセル) EXCEL 和暦を西暦に変換する方法について 4 2023/03/02 20:57
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Access(アクセス) Accessのデータ型の日付/時刻型について 2 2023/02/14 07:40
- Excel(エクセル) Excelで、昭和の西暦換算 6 2023/03/23 11:29
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
value内に変数を入れたい
-
子から親へチェックボックスの...
-
hiddenのvalueの値を変えたい
-
JavaScriptでBMI計算
-
フォームの必須項目を埋めるま...
-
大量のselect要素のvalueを短い...
-
CDOMailで本文テキストの文字コ...
-
setIntervalの間隔を途中で変更...
-
VB.NET DateTimeの型について
-
どのボタンがクリックされたの...
-
IEで動くのに、Firefoxで動かな...
-
フォームに入力された数値を計...
-
フォーム内の値のチェックについて
-
IEで子ウインドウから親ウイン...
-
ラジオボタンの値を関数へわた...
-
プロパティと構造体と列挙型の...
-
PHPとJSで同じNAME属性を使いた...
-
商品コードを入れたら自動で商...
-
小数の足し算
-
ホームページビルダーVer6で、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
value内に変数を入れたい
-
hiddenのvalueの値を変えたい
-
3桁区切りのカンマをつけたい...
-
VB.NET DateTimeの型について
-
複数のsubmitボタンで押された...
-
テキストボックスに入力された...
-
フォーム内容を上から順番にJav...
-
VBAをJavaScriptに変換したいです
-
javascriptでhiddenに二次元配...
-
大量のselect要素のvalueを短い...
-
フォームで入力した値を別のフ...
-
プルダウン選択時、既に入力済...
-
ラジオボタンと連動して文字列...
-
引数に数値、文字列の混在
-
クイズ作成:15個の問題から5個...
-
クリックの度に加算していくには?
-
setIntervalの間隔を途中で変更...
-
Pythonで会員サイトの自動ログ...
-
selectboxのoptionタグのvalue...
-
JavaScriptによる自動計算フォ...
おすすめ情報