IIJmio(みおふぉん)

parseInt() は雑に使うと思わぬ変換が・・・

雑に使ってる私だけかもしれませんが・・・
型に甘いJavaScriptですがフォーム入力などから値をとる事も多い為、 文字列型や数値型にきちんと変換してやる必要がある場合があります。
その時に使う事があるのがparseInt() ですが雑に使うと思わぬ数字が出たりします。

0で始まる文字(数値型、文字列型)や0xで始まる文字(数値型、文字列型)は、それぞれ 8進数、16進数として読み取って10進数に変換して返してきます。 常に10進数として読んでくれると思ってたら変な数字が出る事がありますので、 8進数、16進数などを扱わないプログラムでは、偶発的なミスを避ける為に
parseInt(文字列,10) の様に『10進数として読む』を指定した方が良いでしょう。

サンプル


var str = '92age'; //文字列型

alert( parseInt(str) )

これは頭の92をそのまま10進数として読み取って92を返してくれます。


var str = '092age'; //文字列型

alert( parseInt(str) )

これは頭が0なので8進数として読み取って0が戻ってきます。


var str = '092age'; //文字列型

alert( parseInt(str,10) )

こうすると10進数として読み取って92が戻ってきます。


var str = '0x92a'; //文字列型

alert( parseInt(str) )

こうすると先頭が0x(ゼロエックス)なので16進数として読み取ります。
aも16進数では数字ですから、aまで含めて2346が戻ってきます。


var str = '0x92a'; //文字列型

alert( parseInt(str,10) )

10進数指定してるので読み取り可能な最初の0だけ読み取って0が戻ってきます。

数字以外の文字が混ざってなくても同じ結果です。
この様に単に文字列型を数値に変換する物ではないので、日付などで頭に0が付いた物を 0を外した普通の数字にしようとしてpaserInt(数字)だけにしてしまうと8進数として読み取った10進数が戻ってくる事になってしまいます。 きちんとparseInt(数字,○進数)の様に意図的に指定してやる事が日頃の癖で必要です。
ユーザー入力などを扱う場合は特に。
基本的に数字と文字が混在する値をいきなりparseInt()するのも雑で強引ではありますけど・・。
あらゆる場合を検証していませんが便利なのが、*1 です。

var str = '0205'; //文字列型
alert(str + ' は ' + typeof str + '型') ;

str = str*1;
alert(str + ' は ' + typeof str + '型' )

str*1で型が数値型になって、頭の0が取れています。


var str = '0205night'; //文字列型
alert(str + ' は ' + typeof str + '型') ;

str = str*1;
alert(str + ' は ' + typeof str + '型' )

この様に数字にはならないものでも数値型に変換されます。
NaNになるので*1をしてNaNになれば数値として扱えない文字と言う事になります。
ま、isNaNで調べれば済む話ですが・・

数値を文字列に変える場合には、 + '' を使って済ませるケースがあります。
*1は、ちょうどその逆の便利な使い方ですね。

変数 + '' 数値型 → 文字列型
変数*1 文字列型 → 数値型




専用ページから申し込むと
So-netより高い3万円CB

案ずるより産むが易し
使ってみれば疑問も解決

XREA+ (plus) 206円/月
( お試し7日間 )

CORE SERVER 428円/月
( お試し15日間 )

ロリポップ 270円/月
( お試し期間10日間 )

ヘテムル 1620円/月
( お試し期間15日間 )

さくら 129円/月
( お試し期間2週間 )

無駄な高額ドメイン管理料金払ってませんか?

バリュードメイン
ムームードメイン

お客さんに振込手数料を払わせていませんか?イーバンク銀行同士なら振込手数料無料。 オフィスで簡単振込み イーバンク銀行 ビジネス口座