MaxScript で文字列を数値変換するときの注意

MaxScript で文字列を数値に変換することを考えます。なにを今さら、と思いますか?
私もまさか、こんな罠があるとは知りませんでした。今さら罠を発見したので紹介したいと思います。

基本の文字列→数値変換

このように、整数への変換は as integer 、浮動小数点数への変換は as float を使います。

変換できないものを渡すとundefined になります。

問題点

さてここからが問題です。

はて?

文字列"t" を as integer するとundefined ではなく0 が戻ってきました。つまり0 に変換できたということになります。

そこで調べてみました。

すると出力が

つまり大文字のL、P、小文字のf、m、s、t が数値変換できてしまい、0 になるということがわかります。

さらに謎

もう少し実験。

どうやら大文字は連結するとundefined で変換できなくなり、小文字は連結しても0 に変換されます。

なぜなんだ?

文字列が数字かどうか識別する

さて、なぜこんな話を紹介しているかというと、皆さん文字列が数字かどうか判別したいときどうしてますか? というところにつながるのです。

こんな感じでチェックしたり、してませんか?

私はしてました。ところが上記の問題により、この関数はバグのもとになります。

ということになるからです。この問題を踏まえて正しく動作するisNumber を作ると次のようになります。

そんな面倒なことをしなくてもPython を使えばいいのでは?

もちろんその通りです。

まとめ

  • MaxScript の文字列→数値変換は意外な挙動をするので要注意