20時28分37秒 [Web関連]
JavaScriptでparseIntメソッドを使う際には、「08」や「09」という文字列を渡してしまわないように注意が必要です!
parseIntメソッドは、文字列を数値(整数)に変換するメソッドです。
とすると、変数numには数値の「7」が格納されます。
これは「06」や「005」などでも同様です。
しかしですね、
だと、変数numには「0」が格納されます。
「09」を与えた場合も同様で、「9」を期待しているのに「0」になってしまいます。
この点にどっぷりはまりこんでしまって、「なんでやねん!」とか叫びつつ、昨夜は小一時間ほど無駄にしちゃったような気がします。^^;;;
原因はコレ。↓
parseIntでは、与える文字列の先頭に
されるようです。
なので、「08」や「09」を与えるとゼロになってしまうのですね。8進数の場合、数値は0~7の8個しか使いませんから。
この「8進数だと解釈される」という仕様に気づかず、ずいぶん悩みました。^^;;;
昨夜書いていたのは、「 1:09:30 」のような時刻を表現する文字列を「時」・「分」・「秒」に分割して、秒数に変換するコード。(下記ソース)
例えば、「 1:09:00 」みたいな文字列があるとき、その文字列をコロン記号で「時・分・秒」に分割して配列に突っ込み、それぞれを parseInt メソッドで数値に変換し、「時×60×60」+「分×60」+「秒」を計算することで、秒数に変換しています。
なので、「08」や「09」という文字列が出てくるんですよね……。
まさかそれが8進数と解釈されるとは思いませんでした。^^;;;
私がたまたま参照していたJavaScriptのポケット文法ブックにはその点は説明されていなかったので。(^_^;;;
むしろ parseInt メソッドってのは、そういう「頭ゼロ」とか余計な部分をうまい具合に解釈して数値化してくれるメソッドちゃうんかい!と思ったんですけどね。^^;;;
8進数とか16進数とかは、パラメータで指定させてくれる方が便利だなあ。
※「10」とか「21」とかなら、頭が0ではないのでちゃんと10進数だと解釈されるので問題はありません。
この問題を回避するには、「文字列の先頭が0だったら省く」という処理を加えないといけませんね……。ちょっと面倒です。
私は、(今回はデータ量が少ないこともあって)「08」や「09」が出てくる箇所だけ、「8」や「9」のように1桁になるようデータ自体を書き換えて対処しましたが。^^;;;
parseIntメソッドを使う際にはご注意下さい。(^_^;;;
この日記へのコメントはお気軽に! コメント数:2件
おおおおおおおおぉぉぉぉぉぉぉぉ!!!
Nobeattaさん、情報ありがとうございます。
parseIntメソッドには、第2引数もあったのですね!
参照した解説ブックには書かれていなかったので気付きませんでした。
なるほど、やはりそういう便利な仕様になっていたのですね……!!!
なってこったい。
情報、感謝です!
投稿者 にしし : 2009年10月08日 01:06
コメント数: 2件
parseInt(foo, 10) のように、第2引数に「10」を指定してやれば、
頭に0が入っていても10進数として解釈してくれますよ。
元の文字列を加工する必要はありません。
参考:
developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Functions/parseInt
投稿者 Nobeatta : 2009年10月07日 23:33