yoshiweb.NET

0から始まる文字列を数値に変換する際の落とし穴

Number() や parseInt() で文字列を数値に変換するときに 0x から始まる文字列は16進数、0から始まる文字列は8進数としてと解釈されます。

サーバーからランキングとか桁数を合わせてある文字列を受け取った場合に注意ですね!
trace( Number ("11") ); // 11 ←普通にOK
trace( parseInt("11") ); // 11 ←普通にOK

trace( Number ("000011") ); // 9 ←8進数として解釈された
trace( parseInt("000011") ); // 9 ←8進数として解釈された
trace( parseInt("000011", 8) ); // 9
trace( parseInt("000011", 10) ); // 11 ←10進数で変換するように指示するとOK
trace( parseInt("000011", 16) ); // 17


文字列に小数点を含むと Number() でも10進数として変換してくれます。
trace( Number ("000011.0") ); // 11 ←キタ—!
trace( parseInt("000011.0") ); // 11 ←キタ—!
trace( parseInt("000011.0", 8) ); // 9
trace( parseInt("000011.0", 10) ); // 11 ←どっちでも使える!?
trace( parseInt("000011.0", 16) ); // 17


でも parseInt() は文字列を「整数」に変換する関数なので小数点以下がある文字列に使えません。
trace( Number ("000011.5") ); // 11.5 ←キタ—!
trace( parseInt("000011.5") ); // 11 ←残念...
trace( parseInt("000011.5", 8) ); // 9
trace( parseInt("000011.5", 10) ); // 11 ←残念...
trace( parseInt("000011.5", 16) ); // 17


サーバーからの文字列に少数点があるのとないのが混在してると困りますね。
parseInt("000011", 10)); // ← 整数のときはこれで
Number ("000011.5" ); // ← 少数点があるときはこれ?


そんな時は parseFloat() が使えます。
trace( parseFloat("000011") ); // 11 ←キタ—!
trace( parseFloat("000011.0") ); // 11 ←キタ—!
trace( parseFloat("000011.5") ); // 11.5 ←キタ—!
trace( parseFloat("11") ); // 11 ←キタ—!
trace( parseFloat("11.0") ); // 11 ←キタ—!
trace( parseFloat("11.5") ); // 11.5 ←キタ—!



えぇ、つまり parseFloat() 使ったことがなかった。感動!!って書き込みです。

10進数以外の文字列には使えないみたいですね。
trace( Number ("0xff") ); // 255 ←キタ—!
trace( parseInt ("0xff") ); // 255 ←キタ—!
trace( parseFloat("0xff") ); // 0 ←残念...


8進数なんて使ったことないけど、0から始まる文字列が8進数として解釈されるかどうかの挙動については下記参照。
FN0109004 - 0で始まる数値が0に変わってしまう
FN0109005 - 8進数はサポートされているのか

投稿日 : 2007年04月19日 - yoshiweb - カテゴリ: Flash

コメント

投稿者 : Mahalia

I'm not sure why but this website is loading extremely slow for me.
Is anyone else having this issue or is it a problem on my
end? I'll check back later and see if the problem still exists.
2021年03月24日 10時46分57秒