JavaScript

parseInt() で文字列を数値に変換する時は基数を指定する

前に、JavaScriptでページ内の数値を扱うためにparseInt()で文字列→数値変換したらシクってしまったのでメモしときます。

このときの変換元の文字列というのは「商品の個数」の入力フィールドの値だったので、とりあえず0や数字以外は受け付けないようにして、なお且つ「NaN(数値ではない)」が帰る時は何もしないようにしてました。

// 商品の個数(念のため文字列から数値へ変換)
var n = parseInt( $item.find('select[name="number"]').val() );

でまぁ、「個数 × 商品金額」で「合計金額」を出す、みたいなコードを書いて最初は問題なく動作してたんですが、テストを重ねていくうちに「合計金額」が0になる現象が起きました。

しょっちゅういろんなことで失敗しているせいでトラブルには鼻が利くので「原因はわからんがparseInt()0が帰ってきてる」というのはすぐわかりました。「個数」に0809が指定されると「合計金額」がおかしくなっているのを見つけるまでは早かった。

1ケタの頭の0を取っ払うのはシステム上メンドイし、原因がわからんままは怖い。見つけるまでは早かったがしばらく一人で悩みました。無知で学がないヤツがコードを書くと哀れ、「どっこもおかしくねぇよな」と思いながらググったらすぐに原因が分かりました。

parseInt()には第二引数で基数をちゃんと指定する

// 商品の個数(念のため文字列から数値へ変換)
var n = parseInt( $item.find('select[name="number"]').val(), 10 );

そんなこと知らず10進数が当たり前だと思ってました。parseInt()の第二引数に10進数の10を指定すれば無事解決しました。

ECMAScript 3では推奨されず、ECMAScript 5で認められなくなったものの、多くの実装は0で始まる数字の文字列を8進数として解釈します。(中略)つねに基数を与えれば、予想しない動きが防げます。
parseInt() - JavaScript | MDN

MDNにあるように、推奨されていないものの8進数として解釈される実装があるとのことなので、ブラウザによっては問題ないかもしれないものの、安全のために基数は必ず指定するようにしておいた方がいいみたいです。