にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:20:32.

parseIntで時刻文字列を数値化する際は08や09に注意

JavaScriptでparseIntメソッドを使う際には、「08」や「09」という文字列を渡してしまわないように注意が必要です!
parseIntメソッドは、文字列を数値(整数)に変換するメソッドです。

var num = parseInt("07");

とすると、変数numには数値の「7」が格納されます。
これは「06」や「005」などでも同様です。
しかしですね、

var num = parseInt("08");

だと、変数numには「0」が格納されます。
「09」を与えた場合も同様で、「9」を期待しているのに「0」になってしまいます。

この点にどっぷりはまりこんでしまって、「なんでやねん!」とか叫びつつ、昨夜は小一時間ほど無駄にしちゃったような気がします。^^;;;
原因はコレ。↓

parseIntでは、与える文字列の先頭に

  • 「0」が付くと8進数だと解釈
  • 「0x」が付くと16進数だと解釈

されるようです。
なので、「08」や「09」を与えるとゼロになってしまうのですね。8進数の場合、数値は0~7の8個しか使いませんから。
この「8進数だと解釈される」という仕様に気づかず、ずいぶん悩みました。^^;;;

昨夜書いていたのは、「 1:09:30 」のような時刻を表現する文字列を「時」・「分」・「秒」に分割して、秒数に変換するコード。(下記ソース)

function getSecond( TimeString ) {
   // コロン記号で分割
   var timeArray = TimeString.split(":");
   // 数値に変換しつつ秒を計算
   return parseInt( timeArray[0] ) * 60 * 60 + parseInt( timeArray[1] ) * 60 + parseInt( timeArray[2] );
}

例えば、「 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メソッドを使う際にはご注意下さい。(^_^;;;

コメント

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

おおおおおおおおぉぉぉぉぉぉぉぉ!!!
Nobeattaさん、情報ありがとうございます。

parseIntメソッドには、第2引数もあったのですね!
参照した解説ブックには書かれていなかったので気付きませんでした。

なるほど、やはりそういう便利な仕様になっていたのですね……!!!
なってこったい。
情報、感謝です!

投稿者 にしし : 2009年10月08日 01:06

コメント数: 2件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---