文字列整形まとめ

投稿者: | 2016/04/18

今回はMaxScriptで利用できる文字列整形の方法をまとめてみました。
おすすめは、.NETのString.Formatを使う方法です。

加算演算を使ったシンプルな結合

i = 25
s = "Test1"
"Values: (" + s + ", " + (i as string) + ")"

--> "Values: (Test1, 25)"

基本的にこれだけで問題無い事も多いのですが、結合データ数が増えてくると使い勝手が悪くなってきます。
また、数値の複雑な整形は出来ません。

formatを使った整形

次によく使われる方法として、標準関数のformatがあります。
formatはtoオプションを指定する事によって、出力先をStringStreamに変更する事が出来ます。

s = "Test2"
i = 36
ss = StringStream ""
format "Values: (%, %)" s i to:ss

ss as string

--> "Values: (Test2, 36)"

StringStreamは高速な文字列ストリームなので、長文の整形などを高速に行う事ができます。
文字列のプレースホルダにはパーセント記号(%)を使用し、第二引数以降のデータを%部分に埋め込む事が出来ます。

ただし、整形の為にわざわざStringStreamを用意し、最終的にStringに変換する必要があるため、頻繁に使用するにはやや面倒な面もあります。

FormattedPrint

formattedPrintは数値を文字列に変換するための、MaxScript標準関数です。
文字の左右揃え、空白の指定、数値の桁数の指定や0(ゼロ)詰めなど、数値整形において必要な機能が一通りそろっています。

ただし、この関数はあくまでも数値を文字列に変換する関数であるため、複雑な文字列の整形を行う事は出来ません。
その場合、formatと組み合わせる必要があります。

-- 5桁で0詰めして整数出力
formattedPrint 987 format:"05d"
--> "00987"

-- 文字数10文字(記号含む)、小数部5桁で浮動小数出力
formattedPrint pi format:"10.5f"
--> "   3.14159"

-- 0詰めと組み合わせ
formattedPrint pi format:"010.5f"
--> "00003.1416"

その他詳細はリファレンスを参照してください。

DotNetを使った整形

最後に、最も高機能な方法として、.NET FrameworkのString.Formatを使用する方法を紹介します。

s = "Test3"
i = 48
(dotNetClass "System.String").Format "Values: ({0}, {1})" s i

--> "Values: (Test3, 48)"

一見するとプレースホルダの書式が違う以外は、formatと大差ないように見えます。
プレースホルダは、{0}, {1}という風に、大括弧+引数の番号で指定します。

formatとの違いは、プレースホルダ内で複雑な整形指定子を指定出来る点です。
以下の例では、浮動小数の少数桁数を4桁に指定して出力しています。

(dotNetClass "System.String").Format "{0:F4}" pi

--> "3.1415"

その他にも、formattedPrintを超える、ありとあらゆる整形指示を行う事が出来ます。

詳細に関しては説明していくと切りが無いのでここでは書きませんが、細かく紹介しているサイトやリファレンスが沢山あります。

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

String.Formatの問題

MaxScriptでString.Formatを使う際の注意点として、引数を最大で3つまでしか指定出来ないという問題点があります。
4つ以上指定しようとすると、対応する引数パターンが存在しないとしてエラーが発生してしまいます。

そういった場合、引数を配列としてまとめて渡してやる事が可能です。

strCls = dotNetClass "System.String"

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

-- 3つ以上は配列で指定する
values = #(10, 20, "Foo", "Bar", "Baz")
strCls.Format "{0}, {1}, {2}, {3}, {4}" values
>> "10, 20, Foo, Bar, Baz"

多機能な分複雑ではありますが、使いこなせば非常に強力なツールになるので、是非活用していきたいところですね。

コメントを残す

メールアドレスが公開されることはありません。