フォーマットとは、定数文字列の各所に計算値を代入して文字列を構成することを指します。この定数文字列は、他の値の出力方法や表示位置を制御するもので、フォーマット文字列と呼ばれます。
表示するメッセージを計算する際には、書式指定が役立つことが多いです。実際、関数 message と
error は、ここで説明しているのと同じ書式指定機能を提供しており、format-message との違いは、書式指定の結果の利用方法だけです。
この関数は、フォーマット指定子を対応する objects のエンコーディングに置き換えた、string と等しい文字列を返します。引数 objects は、フォーマット対象となる計算済みの値です。
string の文字は、書式指定を除き、テキストプロパティ(もしあれば)も含めてそのまま出力にコピーされます。書式指定のテキストプロパティは、引数 objects の生成された文字列表現にコピーされます。
出力文字列を新たに確保する必要はありません。例えば、x が文字列 "foo" である場合、式 (eq x (format
x)) と (eq x (format "%s" x)) はともに
t を返す可能性があります。
この関数は format と同様に動作しますが、string 内のグレイヴ・アクセント (`) やアポストロフィ
(') も text-quoting-style
の値に従って変換します。
通常、フォーマット内のグレイヴアクセントやアポストロフィは、対応する曲線引用符に変換されます。例えば、"Missing `%s'" は "Missing
‘foo’" になる場合があります。この変換を制御または抑制する方法については、テキスト引用スタイル を参照してください。
フォーマット仕様は、‘%’で始まる文字列です。したがって、stringの中に‘%d’がある場合、format関数はそれをフォーマット対象の値(引数objectsのいずれか)の表示形式に置き換えます。例えば:
(format "The value of fill-column is %d." fill-column)
⇒ "The value of fill-column is 72."
format は ‘%’
という文字を書式指定として解釈するため、第1引数に任意の文字列を決して渡してはいけません。特に、その文字列が何らかの Lisp
コードによって生成される場合はなおさらです。その文字列に ‘%’
という文字が一切含まれないことが分かっている場合を除き、以下に説明する "%s" を第1引数に、文字列を第2引数として、次のように渡してください:
(format "%s" arbitrary-string)
一部のフォーマット仕様では、特定の型の値が求められます。要件に適合しない値を指定すると、エラーが通知されます。
有効なフォーマット仕様の一覧は以下の通りです。
仕様を、クォートを用いない(すなわち prin1 ではなく princ を使用する――出力関数を参照)オブジェクトの印刷表現に置き換えます。したがって、文字列は内容のみで表現され、‘"’ 文字は含まれず、シンボルは ‘\’ 文字なしで表示されます。
オブジェクトが文字列の場合、そのテキストプロパティが出力にコピーされます。‘%s’自体のテキストプロパティもコピーされますが、オブジェクト側のものが優先されます。
仕様を、クォート(すなわち prin1 を使用――出力関数を参照)を用いて作成したオブジェクトの印刷表現に置き換えます。したがって、文字列は
‘"’ 文字で囲まれ、特殊文字の前に必要な箇所には
‘\’ 文字が挿入されます。
Replace the specification with the base-two or binary representation of an
integer. The representation has leading ‘-’ if negative; for an unsigned two’s
complement representation of a possibly-negative integer n, format (logand n mask) where mask corresponds to the desired word size. Although plain
‘%b’ and ‘%B’ are identical, ‘%#b’ prefixes with lower case ‘0b’ and ‘%#B’ with upper case. The object can also be a
floating-point number that is formatted as an integer, dropping any
fraction.
仕様を整数の8進数表現に置き換えます。‘%b’と同様に、負の値の場合は先頭に‘-’が付きます。また、オブジェクトは、小数部分を切り捨てて整数としてフォーマットされた浮動小数点数である場合もあります。
仕様を符号付き整数の10進表記に置き換えてください。また、オブジェクトは、小数部分を切り捨てて整数としてフォーマットされた浮動小数点数であっても構いません。
仕様を整数の16進数表記に置き換えます。‘%b’と同様に、負の値の場合は先頭に‘-’が付きます。‘%x’では小文字が、‘%X’では大文字が使用されます。また、整数としてフォーマットされ、小数部分を切り捨てた浮動小数点数を指定することも可能です。
仕様を、指定された値となる文字に置き換えてください。
仕様を浮動小数点数の指数表記に置き換えてください。
仕様を浮動小数点数の小数点表記に置き換えてください。
仕様を、指数表記または小数点表記を用いた浮動小数点数の表記に置き換えます。指数が −4 未満、または精度(デフォルト: 6)以上となる場合は、指数表記が使用されます。デフォルトでは、結果の小数部分から末尾のゼロが削除され、小数点文字はその後に数字が続く場合にのみ表示されます。
仕様を単一の ‘%’ に置き換えます。この形式仕様は、唯一の形式が単純な
‘%%’ であり、値を用いないという点で異例です。例えば、(format "%% %d" 30) は "% 30" を返します。
その他のフォーマット文字を指定すると、‘Invalid format operation’エラーが発生します。
以下に、一般的な text-quoting-style 設定を想定した例をいくつか挙げます。
(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-message
"The name of this buffer is ‘%s’." (buffer-name))
⇒ "The name of this buffer is ‘strings.texi’."
(format-message
"The buffer object prints as `%s'." (current-buffer))
⇒ "The buffer object prints as ‘strings.texi’."
デフォルトでは、フォーマット指定は objects 以降の連続する値に対応します。したがって、string 内の最初のフォーマット指定にはその最初の値が、2番目のフォーマット指定には2番目の値が、というように使用されます。余分なフォーマット指定(対応する値がないもの)がある場合はエラーとなります。フォーマット対象の余分な値は無視されます。
フォーマット指定にはフィールド番号を指定できます。これは、先頭の‘%’の直後に10進数が続き、その後にリテラルのドル記号‘$’が続く形式です。これにより、フォーマット指定は、次の引数ではなく、指定された番号の引数を変換します。フィールド番号は1から始まります。フォーマットには、番号付きまたは番号なしのフォーマット指定のいずれか一方を含めることができますが、両方を含めることはできません。ただし、‘%%’は番号付き指定と混在させることができます。
(format "%2$s, %3$s, %%, %1$s" "x" "y" "z")
⇒ "y, z, %, x"
‘%’ および任意のフィールド番号の後には、特定のフラグ文字を記述できます。
フラグ ‘+’ は、非負数の前にプラス記号を挿入し、常に符号が付くようにします。フラグとしてスペース文字を指定すると、非負数の前にスペースが挿入されます。(それ以外の場合、非負数は最初の桁から始まります。)これらのフラグは、非負数と負数で同じ列数が使用されるようにするために有用です。これらは ‘%d’、‘%e’、‘%f’、‘%g’ を除き無視され、両方のフラグが使用されている場合は ‘+’ が優先されます。
フラグ ‘#’ は、使用されているフォーマットに応じた代替形式を指定します。‘%o’ の場合、結果が ‘0’ で始まることを保証します。‘%x’、‘%X’、‘%b’ および ‘%B’ の場合、0以外の結果の先頭に、それぞれ ‘0x’、‘0X’、‘0b’ または ‘0B’ を付加します。‘%e’ および ‘%f’ の場合、‘#’ フラグは、精度が0であっても小数点を含めることを意味します。‘%g’ の場合、常に小数点を含め、さらに小数点後の末尾の0を、本来であれば削除される箇所にそのまま残すようにします。
フラグ ‘0’ は、パディングにスペースではなく ‘0’ 文字が使用されるようにします。このフラグは、‘%s’、‘%S’、‘%c’ といった数値以外の指定文字に対しては無視されます。これらの指定文字は ‘0’ フラグを受け付けますが、それでも スペース でパディングされます。
フラグ ‘-’ を指定すると、width で指定されたパディングが左側ではなく右側に挿入されます。‘-’ と ‘0’ の両方が指定されている場合、‘0’ フラグは無視されます。
(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 "The word '%-7s' actually has %d letters in it."
"foo" (length "foo"))
⇒ "The word 'foo ' actually has 3 letters in it."
仕様には幅を指定でき、これは任意のフィールド番号やフラグの後に続く10進数です。オブジェクトの出力表現に含まれる文字数がこの幅より少ない場合、formatはパディングによって幅を拡張します。幅によって導入されるパディングは、通常、左側に挿入されるスペースで構成されます:
(format "%5d is padded on the left with spaces" 123)
⇒ " 123 is padded on the left with spaces"
幅が狭すぎる場合、format
はオブジェクトの表示表現を切り捨てません。したがって、情報が失われるリスクなく、幅を指定して列間の最小間隔を設けることができます。以下の2つの例では、「%7s」が最小幅7を指定しています。1つ目の例では、「%7s」の代わりに挿入された文字列は3文字しかなく、パディングとして4つの空白が必要です。2つ目の例では、文字列
"specification" は13文字幅ですが、切り捨てられません。
(format "The word '%7s' has %d letters in it."
"foo" (length "foo"))
⇒ "The word ' foo' has 3 letters in it."
(format "The word '%7s' has %d letters in it."
"specification" (length "specification"))
⇒ "The word 'specification' has 13 letters in it."
すべての指定文字において、フィールド番号、フラグ、および幅の後に、任意で精度を指定できます。精度は、小数点
‘.’
とそれに続く数字列で構成されます。浮動小数点指定(‘%e’ および
‘%f’)の場合、精度は小数点の後に表示する桁数を指定します。0
の場合は、小数点自体も省略されます。‘%g’
の場合、精度は有効桁数を指定します(有効桁数とは、小数点より前の最初の桁と、小数点より後のすべての桁を指します)。%g の精度が 0
または未指定の場合、1 として扱われます。‘%s’ および
‘%S’
の場合、精度によって文字列が指定された幅で切り詰められるため、‘%.3s’
では object の表現の最初の 3 文字のみが表示されます。その他の指定文字の場合、精度の効果は
printf 系のローカルライブラリ関数が生成する結果となります。
フォーマット済み文字列の後で read
を使用してフォーマット済み値のコピーを取得したい場合は、read
で値を再構成できる仕様を使用してください。数値をこのような可逆的な方法でフォーマットするには ‘%s’ や ‘%S’
が利用でき、整数のみをフォーマットする場合は ‘%d’、‘#x%x’、‘#o%o’
および ‘#b%b’
も使用できます。その他のフォーマットでは、すべての値が保持されるとは限りません。例えば、‘%g’ では精度や型が失われる可能性があり、NaN や無限大は保持されません。入力関数を参照してください。
本節で説明する関数は、固定の仕様文字セットを受け付けます。次節では、‘%a’
や ‘%z’ といったカスタム仕様文字を受け付けることができる関数
format-spec について説明します。