parseIntで戻り値がNaNになるのはなぜ?

このQ&Aのポイント
  • parseIntを使って文字列型から数字だけを抜き出して数値型へ変換したいのですが、下記のようにNaNになってしまいます。何が悪いのでしょうか。
  • 上記のコードでは、変数aに文字列'100点満点'を代入し、parseInt関数を使って変数bにaを数値型に変換した結果を代入しています。しかし、結果はNaN(Not a Number)になっています。
  • この結果は、parseInt関数が文字列を解析する際に、数値に変換できない文字('点満'や'点'など)があるためです。parseInt関数は、文字列を先頭から解析し、数字以外の文字に遭遇すると解析を停止し、その時点までに解析できた数値を返します。そのため、変数bには数値に変換できない部分(文字列'a')があったため、NaNが返されたのです。
回答を見る
  • ベストアンサー

parseIntで戻り値がNaNになるのはなぜ?

parseIntを使って文字列型から数字だけを抜き出して数値型へ変換したいのですが、 下記のようにNaNになってしまいます。何が悪いのでしょうか。 <html lang="ja"> <head> <title></title> </head> <body> <script> var a = "100点満点" var b = parseInt('a',10); document.write('typeof a ⇒ '+typeof a+'<br>'); document.write('var b = parseInt("a",10); ⇒ '+b+'<br>'); document.write('typeof b ⇒ '+typeof b+'<br>'); </script> </body> </html> 上記の結果は、 --------------------------------- typeof a ⇒ string var b = parseInt("a"); ⇒ NaN typeof b ⇒ number ---------------------------------

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

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

'a'なんていう10進数は存在しませんから。 var b = parseInt('a',16); であれば,'a'を16進数と解釈して,その10進表記である 10 が正しく表示されます。 var b = parseInt('a',10); parseInt()の戻り値に対応して,変数bのデータ型はnumber型になりました。'a'という10進数は存在しませんから結果的にその数値変換は失敗してNaNが格納されましたが,変数bのデータ型がnumberであることは変わりません。 逆に言うと,typeof b が number であるから変数bには正しく数値が格納されているはず,という考えは間違っています。

kiseki777
質問者

お礼

aという文字を変換する場合、10進数にない文字なので無理、16進数にはその文字があるからOKということですね。参考になりました。有難うございました。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.2

NaN は Not a Number の事なので それがわかれば、何が悪いのかはわかるかと。

kiseki777
質問者

お礼

ありがとうございます。

関連するQ&A

  • JavaScriptで九九

    繰り返し処理を用いて画像のように表示させたい場合はどこを修正すればいいですか? <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>九九</title> </head> <body> <script> for (var i = 1; i <= 9; i++) { for (var j = 1; j <= 9; j++) { document.write(`${i} * ${j} = ${i*j}<br/>`); } } </script> </body> </html>

  • document writeの中に親の値を代入する

    過去に同じような質問もありましたが、いろいろ検索してこちらの過去ログを拝見しても解決できなかったので質問させてください。 親から参照した値をdocument.writeの中(width=+k+ height=+j+)に代入したいのですが、うまくいきません。 以下がソースです。 <html> <head> <title>課題8-3</title> <SCRIPT language="JavaScript"> <!-- var k = window.opener.document.d1.s1.value; var j = window.opener.document.d1.s2.value var r = ('<center><table width=+k+ height=+j+ border="1"><tr><td></td></tr></table></center>') //alert(j) //document.d1.s3.value=parseInt(k)*parseInt(j); document.write(r); //--> </SCRIPT> </head> <body> <center> <br><br> </center> </body> </html> ご存知の方がいらっしゃいましたらご教授お願いします。

  • フレームサイズの変更について

    過去ログを参照していたら、次のようなサンプルを発見したのですが、 IEでは動作しますが、FireFoxではエラーになってしまいます。 どこを修正すれば動くようになるでしょうか? ■frame.html■ <html> <head><title></title> <script language="javascript"> <!-- document.write(frset('40%','60%','a.htm?','1.htm?')) function frset(a,b,f1,f2){ var frset= '<title>frame</title>\n' +'<frameset cols="'+a+','+b+'">\n' +'<frame src="'+f1+'">\n' +'<frame src="'+f2+'">\n' +'</frameset>\n' return frset } //--> </script> </head> </html> ■a.html■ <html> <head><title></title> </head> <body> 右のリンクで<br>フレームのサイズ<br>が変わるよ! </body> </html> ■1.html■ <html> <head><title></title> <script language="javascript"> <!-- function chsize(a,b){ if(location.search==""){ if(document.all){ parent.document.all.tags("frameset")[0].cols=a+","+b }else{ //parent.document.open() parent.document.write(frset(a,b,parent.frames[0].location.href+"?",parent.frames[1].location.href+"?")) parent.document.close() } } } //--> </script> </head> <body onload="chsize('40%','60%')"> こっち側60%です。 <br> <a href="2.htm">こっち側を40%にする!</a> </body> </html> ■2.html■ <html> <head><title></title> <script language="javascript"> <!-- function chsize(a,b){ if(location.search==""){ if(document.all){ parent.document.all.tags("frameset")[0].cols=a+","+b }else{ //parent.document.open() parent.document.write(frset(a,b,parent.frames[0].location.href+"?",parent.frames[1].location.href+"?")) parent.document.close() } } } //--> </script> </head> <body onload="chsize('60%','40%')"> <a href="1.htm">こっち側を60%にする!</a> <br> こっち側40%です。 </body> </html>

  • テキストボックスがうまく表示できない

    submitをクリックした時、'フリガナ'部分はうまく表示できるのですが'document.frmInfo.kana.value'が表示できないので困ってます。 宜しくお願いします。 <SCRIPT LANGUAGE="JavaScript"> <!--- function mopen(){ var win; win=window.open("","_self"); win.document.open(); win.document.write("<html><head><title></title></head>"); win.document.write("<body bgcolor='#ffffff'>"); win.document.write("<center><br><B>お申し込みありがとうございました。<br><br>メールの内容は下記の通りです。</b><br><br><br></center>") win.document.write("<a href='seminar_1.htm' target='_self'>戻る</a>"); win.document.write("<hr>"); win.document.write("フリガナ:".bold()); win.document.write(document.frmInfo.kana.value); win.document.write("<br><br>"); win.document.write("</body>"); win.document.write("</html>"); return true; } //---> </SCRIPT> <FORM ACTION="mailto:**@***.com" METHOD="POST" ENCTYPE="multipart/form-data" NAME="frmInfo" onSubmit="return mopen()">

  • document.getElementById

    document.getElementByIdでURLを変数に代入したいのですが うまくリンクになりません。 どこが間違っているのでしょうか? どうしたらよいのでしょうか? ソースはこちらです <!DOCTYPE html> <html lang="ja"> <head> <script language="JavaScript" type="text/javascript"> var url = 'http://www.goo.ne.jp/'; var urlgoo = document.getElementById("urlgoo").src = url; </script> </head> <body> <a id="urlgoo" title="sample">Link</a> </body> </html>

  • 3の倍数の合計値

    3の倍数を足した合計値を表示するにはどうすればいいか教えてください。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>for課題1</title> </head> <body> <script> var sum = 1; for (var i = 1; i <= 100; i++) { if (i % 3 === 0) { } sum += i; document.write(sum);} //表示がうまくいかない //1から100までの間で、3の倍数の数だけを足した合計値(1683)を表示したい </script> </body> </html>

  • for文のiを使ってリンク先のアドレスを指定したい

    <html> <head> <title></title> </head> <body> <script type="text/javascript"> <!-- document.write("<font size ='7'>一覧</font><br>"); for(i = 1; i<6; i++){ document.write('<a href="jwork01.html">課題1</a><br>'); } //--> </script> </body> </html> >document.write('<a href="test01.html">テスト1</a><br>'); test01~05.htmlのリンクと、文字列テスト1~テスト2までをfor文のiを使って テスト1 テスト2 テスト3 テスト4 テスト5 というように、繰り返し表示たいのですがどうやっても正常に反映されません。単純でカンタンなことだとは思うのですが、、教えて頂けませんでしょうか。 お願いします。

  • Firefox/2 カーソルが砂時計のまま while(line=str.shift()){

    <html> <head> <script type="text/javascript"> function init(){ var str="a:b:c".split(/:/); var line; while(line=str.shift()){ document.write(line + "<BR>"); } } </script> </head> <body onload="init()"> </body> </html> 上記をFirefox/2(Win XP)で実行すると、カーソルが砂時計のまま戻りません。(IE6では再現視せず) 回避策ありましたら教えてください。

  • 関数を書く場所が分かりません。

    Windows7 64ビット IE9 ジャバスクリプト。関数を書き込む場所が分かりません。 次のようなプログラム(内容は質問用のものなので意味ありません)で、 c=a*2+b*3の部分をいちいち毎回書くのではなくて、 関数( kansu() )で処理したいのですが、 どこにFuntion kansu(){ }を埋め込めばいいのかわかりません。 教えてください。 // に書いてみましたが、この場所ではダメですか? <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta content="text/html; charset=Shift_JIS" http-equiv="content-type"> <title>スケジュールの作成</title> <script language="JavaScript"> <!-- var a = 1; var b = 2; var c =0; c=a*2+b*3 document.write(c); c=a*2+b*3 document.write(c); c=a*2+b*3 document.write(c); // function kansu(){ // c=a*2+b*3 // }  この3行を有効にしたら上記3つのc=a*2+b*3は削除することになります。 //--> </script> </head><body> </body></html>

  • 初期処理について

    前の質問で以下のコードを教えてもらいましたが、 HTMLの<head>に以下を書いてもdocument.writeは実行されます。 <script> a=1; b=2; function hoge(){ var a=3; b=4; c=5; } hoge(); document.write("a="+a+"<br>"); document.write("b="+b+"<br>"); document.write("c="+c+"<br>"); </script> それで思ったんですけど、後で使い回す画像とかは 関数の外で書いて最初に読み込むとかは、実は常識なのですか? こんな方法で初期処理を記述すればいいんでしょうか。 今は初期処理用の関数をonload時に実行させています。 VBAはこんな真似できなかったと思います。

専門家に質問してみよう