Next: , Previous: , Up: Strings and Characters   [Contents][Index]


4.7 文字列のフォーマット

フォーマット(formatting)とは、定数文字列内のなまざまな場所を計算された値で置き換えることにより、文字列を構築することを意味します。この定数文字列は他の値がプリントされる方法、同様にどこに表示するかを制御します。これはフォーマット文字列(format string)と呼ばれます。

表示されるメッセージを計算するためにフォーマットが便利なことがしばしばあります。実際に関数messageerrorは、ここで説明する機能と同じフォーマットを提供します。これらの関数とformat-messageの違いはフォーマットされた結果を使用する方法だけです。

Function: format string &rest objects

この関数はstringをコピーしてから、対応するobjectsをエンコードする、そのコピー内の任意のフォーマット仕様(format specification)を置換して作成される、新しい文字列をリターンする。引数objectsはフォーマットされる計算された値。

(もしあれば)string内のフォーマット仕様以外の文字は、テキストプロパティーを含めて出力に直接コピーされる。

Function: format-message string &rest objects

この関数はformatと同様に機能するが、text-quoting-styleの各値に応じてstring内のすべてのcurved single quotes文字も変換して、グレイブアクセント(`)とアポストロフィー(')があたかもcurved single quotes文字であるかのように扱う点が異なる。

グレイブアクセントとアポストロフィーでクォートされたフォーマット`like this'は、通常はcurved quotesされた‘like this’を生成する。対照的にアポストロフィーだけでクォートされた'like this'は、通常の英文スタイルであるは2つのclosing curved quotesでクォートされた’like this’を生成する。変数text-quoting-styleが生成されるクォートに影響を与える方法については、Keys in Documentationを参照のこと。

フォーマット仕様(format specification)は‘%’で始まる文字シーケンスです。したがってstring内に‘%d’がるとformatはそれを、フォーマットされる値の1つ(引数objectsのうちの1つ)にたいするプリント表現で置き換えます。たとえば:

(format "The value of fill-column is %d." fill-column)
     ⇒ "The value of fill-column is 72."

formatは文字‘%’をフォーマット仕様と解釈するので、決して最初の引数に不定な文字列(arbitrary string)を渡すべきではありません。これは特に何らかのLispコードga生成siた文字列の場合に当てはまります。その文字列が決して文字‘%’を含まないと確信できないならば、以下で説明するように最初の引数に"%s"を渡して、不定な文字列を2番目の引数として渡します:

  (format "%s" arbitrary-string)

stringに複数のフォーマット仕様が含まれる場合、フォーマット仕様はobjectsから連続して値を引き当てます。つまり、string内の1番目のフォーマット仕様は1番目の値、2番目のフォーマット仕様は2番目の値、...を使用します。余分なフォーマット仕様(対応する値がない場合)にはエラーとなります。フォーマットされる値が余分にある場合は無視されます。

ある種のフォーマット仕様は特定の型の値を要求します。その要求に適合しない値を与えた場合にはエラーがシグナルされます。

以下は有効なフォーマット仕様のテーブルです:

%s

フォーマット仕様を、クォートなしのオブジェクトのプリント表現で置き換える(つまりprin1ではなくprincを使用して置き換える。Output Functionsを参照されたい)。したがって文字列は‘"’文字なしの文字列内容だけが表示され、シンボルは‘\’文字なしで表される。

オブジェクトが文字列なら文字列のプロパティーは出力にコピーされる。‘%s’のテキストプロパティー自身もコピーされるが、オブジェクトのテキストプロパティーが優先される。

%S

フォーマット仕様を、クォートありのオブジェクトのプリント表現で置き換える(つまりprin1を使用して変換する。Output Functionsを参照されたい)。したがって文字列は‘"’文字で囲まれ、必要となる特別文字の前に‘\’文字が表示される。

%o

フォーマット仕様を8進表現の整数で置き換える。

%d

フォーマット仕様を10進表現の整数で置き換える。

%x
%X

フォーマット仕様を16進表現の整数で置き換える。‘%x’なら小文字、‘%X’なら大文字が使用される。

%c

フォーマット仕様を与えられた値の文字で置き換える。

%e

フォーマット仕様を浮動小数点数の指数表現で置き換える。

%f

フォーマット仕様を浮動小数点数にたいする10進少数表記で置き換える。

%g

フォーマット仕様を指数か10進少数のいずれか短いほうの表記を使用した浮動小数点数で置き換える。

%%

フォーマット仕様を1つの‘%’で置き換える。このフォーマット仕様は値を使用しない。たとえば(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’."

フォーマット仕様はフィールド幅(width)をもつことができます。これは‘%’とフォーマット仕様文字(specification character)の間の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."

%’の直後、オプションのフィールド幅指定子の前にフラグ文字(flag characters)を置くこともできます。

フラグ‘+’は正の数の前にプラス符号を挿入するので、数には常に符号がつきます。フラグとしてスペースを指定すると、正数の前に1つのスペースが挿入されます(それ以外は、正数は最初の数字から開始される)。これらのフラグは、確実に正数と負数が同じ列数を使用させるために有用です。これらは‘%d’、‘%e’、‘%f’、‘%g’以外では無視され、両方が指定された場合は‘+’が優先されます。

フラグ‘#’は代替形式(alternate form)を指定します。これは使用するフォーマットに依存します。‘%o’にたいしては結果を‘0’で開始させます。‘%x’と‘%X’にたいしては結果のプレフィクスは‘0x’または‘0X’になります。‘%e’、‘%f’、‘%g’にたいしての‘#’フラグは、少数部が0のときにも小数点が含まれることを意味します。

フラグ‘0’はスペースの代わりに文字‘0’でパディングします。このフラグは‘%s’、‘%S’、‘%c’のような非数値のフォーマット仕様文字では無視されます。これらのフォーマット仕様文字で‘0’フラグを指定できますが、それでもスペースでパディングされます。

フラグ‘-’はフィールド幅指定子により挿入されるパディングに作用し、もしパディングがあるなら左側ではなく右側にパディングされます。‘-’と‘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."

すべてのフォーマット仕様文字には、その文字の前(フィールド幅がある場合はその後)に、オプションで精度(precision)を指定できます。精度は小数点‘.’と、その後に桁文字列(digit-string)を指定します。浮動少数点数のフォーマット仕様(‘%e’、‘%f’、‘%g’)では、精度は表示する小数点以下の桁数を指定します。0の場合は小数点も省略されます。‘%s’と‘%S’にたいしては、文字列を精度で指定された幅に切り詰めます。したがって‘%.3s’では、objectにたいするプリント表現の最初の3文字だけが表示されます。他のフォーマット仕様文字にたいしては、精度の効果はローカルライブラリーのprintf関数ファミリーが生成する効果となります。


Next: , Previous: , Up: Strings and Characters   [Contents][Index]