SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【Javascript】parseInt()と8進数、10進数、16進数……

JavascriptのparseInt()ではまりました。

既存システムのJavascriptで日付の有効性チェックをする関数があったのですが、うまく動かずちょっとデバッグにてこずりました。

コードサンプル

/**
 * 日付判定
 * @param 8桁のセパレートなし数字を引数で渡す
 * @return 存在する日付のときtrue、存在しない日付のときfalse
 */
function isDate(argValue)
{
	var year = parseInt(argValue.substr(0, 4))
	var month = parseInt(argValue.substr(4, 2))
	var day = parseInt(argValue.substr(6, 2))

	//・・・・・・(中略)・・・・・・

	if (year month day を評価して、日付が存在したら) {
		return true
	} else {
		return false
	}
}

原因

原因はタイトルのとおりparseInt()関数で、この関数は整数値らしい文字列を数値に変換するだけだと思っていたら、そうではないようです。

■■ 某リファレンス引用 ■■

◆ parseInt(string [, radix]) (e3/N2)
文字列 string を整数値に変換します。小数点以下は切り捨てられます。
radix に 2, 8, 10, 16 などを指定すると 2, 8, 10, 16進数として解釈します。
radix を省略した場合、”0x” で始まっていれば 16進数として、”0″ で始まっていれば 8進数として、さもなくば 10進数として解釈します。変換に失敗した場合は特別な値 NaN を返します。

文字列”01″~”09″を8進数で評価するのですね。

“01”~”07″は、8進数で評価しても1~7なので結果は変わらないのですが、”08″、”09″は8進数で存在しないので0が返ります。

対策

10進数として評価するには、第2引数をちゃんと指定します。

parseInt("07");    // 7
parseInt("08");    // 0
parseInt("09");    // 0
parseInt("10");    // 10
parseInt("07",10);    // 7
parseInt("08",10);    // 8
parseInt("09",10);    // 9
parseInt("10",10);    // 10

phpのparse_ini_file()関数でも似たようなことが発生するので注意です。

関連するメモ

コメント