yoshiweb.NET

Navigation

カテゴリ

アーカイブ

Number.toString( radix )のワナ

前回のエントリーで parseInt() について調べているときにヘルプに 36進数まで対応しているようなことがあった。
解析する数値の基数を表す整数。有効な値は、2 ~ 36 です。

数字とアルファベット 10文字 + 26文字で 36進数 だから、parseInt()の第2引数に 36 を指定すれば 数字 + アルファベットの文字列は数字に変換できるのか?ということで試してみた。


trace( parseInt("adobe", 36) ); // 17434202 ← キター
trace( parseInt("flash", 36) ); // 26188001 ← キター
trace( parseInt("yoshiweb", 36) ); // 2718346843523 ← キター


Number クラスの toString() メソッドで引数に数字を入れると数値を文字列に変換できるから文字列に復元してみようと試してみた。

trace( (255).toString(16) ); // ff ← 255 を 16進数で変換するとこうなる。
trace( (35).toString(36) ); // z ← 36進数で最後は z だからこれもOK!



では復元開始!!

アルファベット → 数字 → アルファベット(復元)

trace( (17434202).toString(36) ); // adobe ← キター
trace( (26188001).toString(36) ); // flash ← キター
trace( (2718346843523).toString(36) ); // -62rtz1 ← yoshiweb じゃない!?(´゚д゚`)

Flash に理解してもらえませんでした...orz


んで地味に調べてみたら 599147937791 までは正常に文字列に変換できて、それ以降は - (ハイフン)がついたり改行したりなんか変です。

trace( (17434202).toString(36) ); // adobe
trace( (26188001).toString(36) ); // flash
trace( (599147937791).toString(36)); // zik0zj
trace( (599147937792).toString(36)); // -(改行)(スペース)(スペース)0(改行)(スペース)
trace( (599147937793).toString(36)); // -zik0zj


ヘルプには書いてないけど上限があるんだらろうか...。
OS や Flash Player のバージョンによっても違いはあるのかな?

2007年04月22日 - yoshiweb - コメントなし

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 - コメント4件