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


4.7 Formatting Strings

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

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

Function: format string &rest objects

この関数は、stringをコピーしてから、対応するobjectsをエンコードする、コピー内の任意のフォーマット指定(format specification)を置換することにより作成される、新しい文字列をreturnします。引数objectsは、フォーマットされる計算された値です。

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

フォーマット指定は、‘%’で始まる文字シーケンスです。したがって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コードにより生成された文字列の場合に当てはまります。その文字列が決して文字‘%’を含まないと確信できないときは、以下で説明するように最初の引数に"%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"をreturnします。

他のフォーマット文字は、‘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."

フォーマット指定はフィールド幅(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文字だけが表示されます。他のフォーマット指定文字にたいしては、精度は効果がありません。


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