書式付け(formatting)とは、 定数文字列内のさまざま部分を計算値で置き換えた文字列を作ることです。 この文字列は、文字列自体に加えて、 他の値をどのように表示するかも制御します。 この文字列を書式付け文字列(format string)と呼びます。
書式付けは、表示するメッセージを計算する場合に便利です。
実際、関数message
と関数error
には、
ここで説明するのと同じ書式付け機能があります。
それらとformat
との違いは、
書式付けした結果をどのように利用するかです。
この関数は、stringをコピーし、 コピー内の書式付け指定を対応するobjectsの表現で置き換えた 新たな文字列を返す。 引数objectsは書式付けすべき計算値である。
書式付け指定は`%'で始まる文字の列です。
したがって、string内に`%d'があると、
関数format
はそれを書式付けすべき値の1つ
(引数objectsの1つ)の表示表現で置き換えます。
たとえば、つぎのとおりです。
(format "The value of fill-column is %d." fill-column) => "The value of fill-column is 72."
stringに2個以上の書式付け指定がある場合、 書式付け指定はobjectsの後続の値に対応します。 つまり、stringの最初の書式付け指定は最初の値を使い、 2番目の書式付け指定は2番目の値を使い、といった具合です。 (値が対応しない)余計な書式付け指定は、 予測不可能なふるまいを引き起こします。 余計な値は無視します。
特定の書式付け指定は、特定の型の値を必要とします。 要求に適合しない値を読者が指定するとエラーを通知します。
有効な書式付け指定をつぎに示します。
prin1
ではなくprinc
を用いる。see Output Functions)
表示表現で置き換える。
したがって、文字列は`"'文字なしでその内容を表示し、
シンボルは`\'文字なしで表示する。
対応するオブジェクトがなければ空文字列を使う。
prin1
を用いる。see Output Functions)
表示表現で置き換える。
したがって、文字列は`"'文字で囲んで表示し、
シンボルは特別な文字のまえには`\'文字を付けて表示する。
対応するオブジェクトがなければ空文字列を使う。
(format "%% %d" 30)
は"% 30"
を返す。
上記以外の書式付け文字は、エラー`Invalid format operation'になります。
例をいくつか示します。
(format "The name of this buffer is %s." (buffer-name)) => "The name of this buffer is strings.texi." (format "The buffer object prints as %s." (current-buffer)) => "The buffer object prints as strings.texi." (format "The octal value of %d is %o, and the hex value is %x." 18 18 18) => "The octal value of 18 is 22, and the hex value is 12."
すべての書式付け文字には、`%'とその文字のあいだに、 数前置子を指定できます。 省略可能な数前置子はオブジェクトの最小幅を指定します。 オブジェクトの表示表現がこの幅より小さい場合、パディングします。 数前置子が正ならば(あるいはゼロで始まれば)左側にパディングし、 数前置子が負ならば右側にパディングします。 パディング文字は、通常、空白ですが、 数前置子がゼロで始まれば、ゼロでパディングします。 パディングの例を示します。
(format "%06d is padded on the left with zeros" 123) => "000123 is padded on the left with zeros" (format "%-6d is padded on the right" 123) => "123 is padded on the right"
format
は、どんな幅を指定しても、
オブジェクトの表示表現を切り詰めることはありません。
つまり、情報を失うことなく、数前置子を使って最小の桁幅を指定できます。
つぎの3つの例において、`%7s'は最小幅7を指定します。
最初の例では、`%7s'に置き換わる文字列は3文字ですから、
パディングとして空白4個を挿入します。
2番目の例では、文字列"specification"
は13文字幅ですが切り詰めません。
3番目の例では、右側にパディングします。
(format "The word `%7s' actually has %d letters in it." "foo" (length "foo")) => "The word ` foo' actually has 3 letters in it." (format "The word `%7s' actually has %d letters in it." "specification" (length "specification")) => "The word `specification' actually has 13 letters in it." (format "The word `%-7s' actually has %d letters in it." "foo" (length "foo")) => "The word `foo ' actually has 3 letters in it."