parseIntの罠
最近、久しぶりにソース記述ミスによるバグではまったのでメモ。
文字列型をint型に変換するJavaでもお馴染みメソッドparseInt。
javascriptにてn月の翌月を算出するプログラムの中でparseIntを使用して発生した問題。
var i = (parseInt("200809".substr(4)) + 1) % 12; alert(i);
あまりスマートな方法ではないですが、普通に見かけそうな記述です。
実行してみると、あら不思議「10」ではなく「1」になります。
問題はjavascriptのparseIntの解釈にあります。
parseInt(string, radix) string:変換元文字列、radix:基数
第2引数を指定しないと第1引数の先頭文字によって基数が決定される。
"0"始まりの場合8進数、"0x"始まりの場合16進数とのこと。
つまり、parseInt("09")は8進数と見なされ「0」になってしまった模様です。
なので下記が正解です。
var i = (parseInt("200809".substr(4),10) + 1) % 12; alert(i);
ちなみにJavaで同じようなコードをInteger#parseIntで行っても、
上記の現象は起こりません。