MaxScriptTip: 文字列の整形とDotNet

4月 18, 2016 0
MaxScriptで最も簡単な文字列整形方法は、加算演算(+)を使った結合かと思います。
i = 25
s = "Test1"
res = "Values: (" + s + ", " + (i as string) + ")"
>> "Values: (Test1, 25)"
しかし見ての通り、簡単な整形でさえ長くなりがちな上、読みづらくなってしまいます。

そこで次によく使われる方法として、formatがあります。
formatはtoオプションを指定する事によって、出力先をStringStreamに変更する事が出来ます。
s = "Test2"
i = 36
ss = StringStream ""
format "Values: (%, %)" s i to:ss
res = (ss as string)
>> "Values: (Test2, 36)"
こちらはパターン文字列を使って文字列整形出来るので、整形自体は楽ですが、StringStreamを用意する必要がある為コードは長くなってしまいます。
それでも整形が複雑になればなるほど、こちらの方がすっきり綺麗に書く事が出来ます。


最後に、最もオススメな方法として、.NET FrameworkのString.Formatを使用する方法を紹介します。
s = "Test3"
i = 48
res = (dotNetClass "System.String").Format "Values: ({0}, {1})" s i
>> "Values: (Test3, 48)"
非常にすっきり収まります。
必要なら、Stringクラスオブジェクトを予め作っておいて、使い回してもいいでしょう。

書式の仕様として、formatのような % 指定ではなく、{0}, {1}といった大カッコ+引数番号で指定し、必要なら番号のあとに:を付けて、追加の書式指定子を指定する事も出来ます。

以下の例では、浮動小数の少数桁数を4桁に指定して出力しています。
strCls = dotNetClass "System.String"
for i = 1 to 5 do
    print (strCls.Format "{0:F4}" (random 0.0 1.0))
>> "0.4916"
>> "0.3504"
>> "0.2075"
>> "0.9754"
>> "0.7172"
また、埋め込み引数の数が3つを超える場合、配列を使って指定する事が出来ます。
strCls = dotNetClass "System.String"

-- 3つまではOK
strCls.Format "{0}, {1}, {2}" "Foo" "Bar" "Baz"
>> "Foo, Bar, Baz"

-- 3つ以上は配列で指定する
strCls.Format "{0}, {1}, {2}, {3}, {4}" (for i = 1 to 5 collect i)
>> "1, 2, 3, 4, 5"
多機能な分少々複雑ではありますが、使いこなせば非常に強力なツールなので、是非使っていきたい機能です。

細かい仕様に関しては.NETのリファレンスか、詳しく解説しているサイト様も沢山ありますので、そちらで調べてみると良いかと思います。
以下に使えそうなページを幾つか紹介しておきます。

リファレンス: 標準の数値書式指定文字列
リファレンス: カスタム数値書式指定文字列
smdn様: 書式指定子
@IT様:  数値を右詰めや0埋めで文字列化するには?