- PR -

parseIntとNumber (JavaScript)

1
投稿者投稿内容
もなむ
会議室デビュー日: 2004/06/08
投稿数: 16
投稿日時: 2004-07-21 18:38
#JavaScriptの投稿はこちらでよいのでしょうか?

いま、文字列を数値に変換しようと思っています。
変換のために、parseInt()を使って以下のように記述しました。

 var num = parseInt( str );

これで一件うまくいっているように見えたのですが、
strに"0"で始まる値を入力されると8進数として解釈されてしまいました。
#これはこれで納得できます。

そこで、試しにNumberオブジェクト(関数?)を使って以下のように記述してみました。

 var num = Number( str );

すると、"0"で始まる文字列でも意図した10進数になることが確認できました。

お聞きしたいこと
・"0"で始まる文字列を数値に変換する際にparseInt()とNumber()の挙動はなぜ違うのか?
・Number()以外に何かよい方法は無いか?

以上です。



[ メッセージ編集済み 編集者: もなむ 編集日時 2004-07-21 18:47 ]
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-07-21 21:52
parseInt及びNumberを仕様書(邦訳ですが)で調べてみました。

Global::parseInt (string , radix)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-1_Global_Object.html#section-15.1.2.2

関数として呼ばれる Number コンストラクタ
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-7_Number_Objects.html#section-15.7.1
String 型に適用される ToNumber
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/9_Type_Conversion.html#section-9.3.1


> ・"0"で始まる文字列を数値に変換する際にparseInt()とNumber()の挙動はなぜ違うのか?
リンク先を参照頂ければ分かりますが、parseIntとNumberでは文字列を数値に変換するロジックが違います。
# 「なぜ違うのか?」という問いの答えになってるでしょうか?
因みに8進数として解釈するのはIEでの実装です。
手元のOpera7.52では10進数として解釈しますし、仕様的にも10進数として解釈することが推奨されています。

> ・Number()以外に何かよい方法は無いか?
「よい方法」というのがどのような観点からか分かりませんが、
parseIntの第2引数に10を指定するのは如何でしょう?
また、値から0を引くという方法もあるようです。
http://tohoho.wakusei.ne.jp/js/builtin.htm#toNumber

もなむ
会議室デビュー日: 2004/06/08
投稿数: 16
投稿日時: 2004-07-22 10:29
引用:

parseInt及びNumberを仕様書(邦訳ですが)で調べてみました。


ECMAScriptの仕様書を調べるのを忘れていました。

引用:

> ・"0"で始まる文字列を数値に変換する際にparseInt()とNumber()の挙動はなぜ違うのか?
リンク先を参照頂ければ分かりますが、parseIntとNumberでは文字列を数値に変換するロジックが違います。
# 「なぜ違うのか?」という問いの答えになってるでしょうか?
因みに8進数として解釈するのはIEでの実装です。
手元のOpera7.52では10進数として解釈しますし、仕様的にも10進数として解釈することが推奨されています。


なるほど。ブラウザによる挙動の違いが有るのですね。
ということは、第2引数無しのparseInt()を使用するのは危険ですね。

結論としては、明示的に基数を指定できるparseInt()を使おうと思います。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)