英語版
このページの英語版を見る

std.format

本パッケージは、スタイルフォーマット文字列を用いた文字列フォーマット機能を提供する。 printf スタイル書式文字列
サブモジュール 関数名 説明
パッケージ format フォーマット文字列に従って引数を文字列に変換する。
パッケージ sformat フォーマット文字列に従って引数をバッファに変換する。
パッケージ FormatException フォーマット中に問題が発生したことを知らせる。
write formattedWrite フォーマット文字列に従って引数を変換し、結果を出力範囲に書き込む。 結果を出力範囲に書き込む。
write formatValue 任意の型の値を書式指定子に従ってフォーマットし、結果を出力範囲に書き込む。 結果を出力範囲に書き込む。
read formattedRead 書式文字列に従って入力範囲を読み取り、読み取った値を引数に格納する。 値を引数に格納する。
read unformatValue 与えられた入力範囲から値を読み取り、書式指定子に従って変換する。 書式指定子に従って変換する。
spec FormatSpec フォーマット文字列の一般的なハンドラ。
spec singleSpec 単一の書式指定子に対してFormatSpec を返すヘルパー関数。

制限事項 本パッケージはローカライズをサポートしない。 浮動小数点ユニットの丸めモードが利用可能な場合はそれに従う。 に従う。

フォーマット文字列

本パッケージに含まれる関数は、フォーマット文字列を使用する。A 書式文字列は、読み書きのために別の文字列のレイアウトを記述する。 のレイアウトを記述する。フォーマット文字列は、通常のテキスト で構成される書式指定子は '%'で始まり、オプションで1つ以上のパラメータが続く。 パラメータが続き、書式指示子で終わる。書式指示子 書式指示子は、単純な書式文字であってもよいし、複合指示子であってもよい。 指示子である。
書式文字列は以下の文法に従って構成される:
FormatString:
    FormatStringItem FormatString
FormatStringItem:
    Character
    FormatSpecifier
FormatSpecifier:
    '%' Parameters FormatIndicator
FormatIndicator: FormatCharacter CompoundIndicator FormatCharacter: see remark below CompoundIndicator: '(' FormatString '%)' '(' FormatString '%|' Delimiter '%)' Delimiter empty Character Delimiter
Parameters: Position Flags Width Precision Separator Position: empty Integer '$' Integer ':' Integer '$' Integer ':' '$' Flags: empty Flag Flags Flag: '-'|'+'|' '|'0'|'#'|'=' Width: OptionalPositionalInteger Precision: empty '.' OptionalPositionalInteger Separator: empty ',' OptionalInteger ',' OptionalInteger '?' OptionalInteger: empty Integer '*' OptionalPositionalInteger: OptionalInteger '*' Integer '$'
Character '%%' AnyCharacterExceptPercent Integer: NonZeroDigit Digits Digits: empty Digit Digits NonZeroDigit: '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' Digit: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'

注釈 FormatCharacterは指定されていない。この文法では この文法では他の目的のない文字であれば何でもよい。 (小文字と大文字の)文字を指定することを推奨する。

注釈 CompoundIndicatorの Parameterは、現在のところ、 フラグに限られている。 '-' フラグに限定されている。

フォーマット・インジケータ

フォーマットインジケータは、1文字か、または と で囲まれた式である。 %( %)で囲まれた式のいずれかである。 これは、値がフォーマットされる基本的な方法を指定し、値をフォーマットするための最小要件である。 値をフォーマットするための最小要件である。
以下の文字がフォーマット文字として使用できる:
フォーマット文字 意味
's' 人間が読める形式でフォーマットする。 すべての型で使用できる。
'c' 文字としてフォーマットする。
'd' 符号付き10進整数としてフォーマットする。
'u' 基礎となるビット表現の10進イメージとしてフォーマットする。
'b' 基礎となるビット表現の2進画像としてフォーマットする。
'o' 基となるビット表現の8進画像としてフォーマットする。
'x' /'X' 基となるビット表現の16進イメージとしてフォーマットする。
'e' /'E' 10進科学表記法による実数としてフォーマットする。
'f' /'F' 10進自然数表記の実数としてフォーマットする。
'g' /'G' 実数を10進ショート記法で表記する。 数値に応じて、科学的記数法または 自然記法が使われる。
'a' /'A' 16進科学記法の実数としてフォーマットする。
'r' 生バイトとしてフォーマットする。 出力は表示不可能な場合があり、エンディアンに依存する。
複合インジケータは、配列や構造体のような複合型をより詳細に記述するために使用できる。 をより詳細に記述するために使用できる。複合型は、 と で囲まれている。 '%(' '%)'で囲まれている。囲まれたサブフォーマット文字列は、個々の要素に適用される。 を個々の要素に適用する。要素の指定子に続く 要素の指定子に続くサブフォーマット文字列の末尾部分は、デリミタと解釈される。 要素の指定子の後に続くサブフォーマット文字列の末尾部分は、デリミタとして解釈されるため、最後の要素の後には省略される。 の後は省略される。'%|' 。 文字列の前の部分が最後の要素の後に含まれるようにする。 文字列の前の部分が最後の要素の後に含まれるようにする。
複合指示子内の書式文字列は、次のようにしなければならない。 複合指示子の内部の書式文字列は、正確に1つの書式指定子(連想配列の場合は2つ)を含むべきである。 配列の場合は2つ)を含んでいなければならない。 の要素の書式モードを指定する。この書式指定子は、複合 インジケータそのものであることもある。

注釈: 複合指示子の内部では、文字列と文字が混在している。 複合指示子の内部では、文字列と文字は自動的にエスケープされる。 は自動的にエスケープされる。この動作を避けるには"%-(" の代わりに"%(" を使用する。

フラグ

フォーマットの結果に影響するいくつかのフラグがある。
フラグ 意味
'-' フォーマットされた結果がwidthパラメータで与えられた値より短い場合、出力は残される。 よりも短い場合、出力は左寄せになる。 になる。'-' フラグがない場合、出力は 右寄せのままである。
'-' フラグが異なる意味を持つ例外が2つある。 (1)'r' 、リトルエンディアンを使用する。 (2)複合インジケータの場合、メンバの特別な処理が適用されない。 メンバーの特別な処理は適用されない。
'=' 書式設定された結果がwidthパラメータで与えられた値より短い場合、出力はwidthパラメータで与えられた値より短くなる。 widthパラメータで与えられる値よりも短い場合、出力は中央配置される。 中央位置が不可能な場合は、少し右に移動される。 に移動される。この場合、'-' フラグに加えて、 フラグが存在すると、そのフラグが適用される。 この場合、'=' フラグに加えて フラグが存在すると、わずかに左に移動する。
'+' /' ' 数値に適用される。デフォルトでは、正の数は + 記号を含むようにフォーマットされない。これら2つのフラグのいずれかを指定する、 正数の前にはプラス記号かスペースが置かれる。 両方のフラグがある場合は、プラス記号が使われる。
'r' の場合、ビッグエンディアン形式が使用される。
'0' 右寄せで表示される数値に適用される。 ゼロフラグがある場合、数値の左側のスペースは空白ではなくゼロで埋められる。 は空白ではなくゼロで埋められる。
'#' 代替出力を使用しなければならないことを示す。これは、書式設定される "型"と と使用されるフォーマット文字に依存する。詳細は以下の セクションを参照のこと。

幅、精度、セパレーター

widthパラメータは結果の最小幅を指定する。
precisionの意味はフォーマット・インジケータに依存する。整数の場合は 整数の場合は、表示される最小桁数を示す。 実数の場合は小数点以下の桁数、文字列や複合型の場合は 文字列と複合型の場合は、出力に含まれる要素の最大数を示す。 を示す。
セパレータは数値の書式設定に使用される。これが指定された場合、出力は3桁の塊に分割される、 ','で区切られた3桁ずつのチャンクに分割される。 ','の後に数字または'*' を指定することで、チャンク内の桁数を明示的に指定できる。
'*'この場合、次の引数が桁数として使用される。 桁数として使用される。引数が負数の場合、精度とセパレータパラメータは未指定とみなされる。 separatorパラメータは未指定とみなされる。幅については は絶対値が使われ、'-' フラグが設定される。
セパレータの後に'?' を続けることもできる、 を追加引数で指定する。 を指定する。

位置

デフォルトでは、引数は指定された順序で処理される。引数 引数を直接指定することができる。 を直接指定することができる。で区切られた2つの数字で、一連の引数を表すこともできる。 ':'で区切られた2つの数字で一連の引数を表すこともできる。 で区切られた2つの数字で一連の引数を表すこともできる。番目の数字は省略可能である。その場合、一連の引数は最後の で終わる。
'*' の後に数字と'$' を追加することで、精度セパレーターに位置引数を使うこともできる。

このセクションでは、型とフォーマット文字を組み合わせた結果について説明する。 文字との組み合わせの結果について説明する。このセクションは2つのサブセクションで構成されている。 書式文字が存在する場合の型の書式に関する一般的な情報のリストと、書式文字が存在する場 書式文字が存在する場合の型の書式設定に関する一般的な情報のリストと、型と書式文字の利用可能なすべての組み合わせの詳細を含む表である。 表で構成されている。
型をフォーマットする際には、以下のルールが適用される:
  • フォーマット文字が大文字の場合、結果の文字列は大文字でフォーマットされる。 は大文字でフォーマットされる。
  • 浮動小数点数のデフォルトの精度は6桁である。
  • 浮動小数点数の丸めは、浮動小数点ユニットの丸めモードがあればそれに従う。 浮動小数点数値の丸めは、浮動小数点ユニットの丸めモードがあれば、それに従う。
  • 浮動小数点値NaNInfinity は、次のようにフォーマットされる。 naninf のように書式化され、その前に'+' または'-' の符号が付くこともある。
  • 実数のフォーマットは、64ビット実数と80ビット実数のみサポートされる。 他のすべての実数は、フォーマットされる前にdoubleにキャストされる。これにより これは、非常に大きな数の場合、結果がinf になる原因となる。
  • 複合型の内部で's' フォーマット文字でフォーマットされた文字と文字列は、単一の文字で囲まれる。 でフォーマットされた文字と文字列は、シングルクォートとダブルクォートで囲まれる。 で囲まれ、印字不可能な文字はエスケープされる。これを避けるために'-' フラグを指定することができる。 (にフラグを指定することができる(例:"%(%s%)" の代わりに"%-(%s%)" )。
  • 構造体、共用体、クラス、インターフェイスは、可能であれば toString メソッドを呼び出すことで整形される。 詳細は module std.format.writeを参照のこと。 を参照のこと。
  • これらの組み合わせの一部だけが読み取りに使用できる。以下を参照のこと。 module std.format.readを参照のこと。 を参照のこと。
この表は 型" と "フォーマット文字" のすべての可能な組み合わせについての説明が含まれている:
タイプ フォーマット文字 書式
null 's' null
bool 's' false またはtrue
'b' 'd', , , 、'o' 'u' 'x' 'X' 同じフォーマット文字を持つ積分0または1として。
'o''x''#' フラグを付けると、 の特別な処理により、予期しない結果が生じることがある。 の特別な処理により、予期しない結果が生じる可能性がある。 の特別な処理により、予期せぬ結果を生じる可能性がある。
'r' \0 または\1
積分 's','d' 符号付き10進数。'#' フラグは無視される。
'b' 'o', , 、'u' 'x' 'X' 符号なし2進数、10進数、8進数、16進数。
'o''x' の場合、'#' フラグは、数値の前に と を付けなければならないことを示す。 の場合は、00x が前になければならないことを示す。 ただし、値0はこの限りではない。と の場合 'b' および'u' の場合、'#' フラグは何の効果もない。
'e' 'E', , , , , 、'f' 'F' 'g' 'G' 'a' 'A' 同じ指定子を持つ浮動小数点値として。
デフォルトの精度は、積分値のすべての桁を加算するのに十分な大きさである。 である。
($B'a')と'A' の場合、積分値の桁は16進数で指定できる。 任意の16進数である。
'r' 2進表現から直接取り出した文字。
浮動小数点 'e','E' 科学的表記法:ちょうど1つの整数桁の後にドット と小数桁が続き、その後に指数が続く。 指数の書式は、'e' の後に '+' または'-' 記号の後に、少なくとも2桁が続く。 桁が続く。
小数桁がなく、'#' フラグがない場合は、ドットは省略される。 がない場合、ドットは省略される。
'f','F' 自然表記:自然表記:整数桁の後にドットと 端数桁。
端数桁がなく、'#' フラグがない場合、ドットは省略される。 がない場合、ドットは省略される。
注釈:'f''F' の違いは、NaNInfinity に対してのみ表示される。
's' 'g' の場合のみである、'G' 短い表記:よりも絶対値が大きい場合は、科学的表記法を用いる。10 ^^ precision または0.0001 より小さい場合、科学的表記法が用いられる。 そうでない場合は自然表記が適用される。
どちらの場合も、精度は積分桁を含むすべての桁数を表す。 を含むすべての桁数を示す。末尾のゼロ(末尾のドットを含む)は取り除かれる。
'#' フラグがある場合、末尾のゼロは除去されない。
'a','A' 16進科学表記法:0x の後に続く。1 (値ゼロまたは非正規化数値の場合は0 )。 の後にドット、16進数表記の小数桁、指数が続く。 表記と指数である。指数は、p 、 の後に符号、そして10進数表記の指数が続く。
小数桁がなく、'#' フラグがない場合は、ドットは省略される。 がない場合、ドットは省略される。
'r' 2進表記から直接取り出した文字。
文字 's','c' 文字として。
複合指示子の内部's' は異なる扱いを受ける:は異なる扱いを受ける。 文字はシングルクォートで囲まれ、表示不可能な 文字がエスケープされる。これは '-' フラグを付けることで回避できる。 (例えば、"%-(%s%)" )。
'b' 'd', , , 、'o' 'u' 'x' 'X' 文字を表す積分として。
'r' バイナリ表現から直接取り出した文字。
文字列 's' 文字列を形成する文字の並び。
複合指示子の内部では、文字列は二重引用符 で囲まれ、表示不可能な文字はエスケープされる。これは 複合指示子の前に'-' フラグを付けることで回避できる。 (例:"%-(%s%)") を付けることで回避できる。
'r' 一連の文字は、それぞれ'r' でフォーマットされる。
複合 文字の配列。
配列 's' 要素が文字の場合、配列は次のようにフォーマットされる。 としてフォーマットされる。それ以外の場合は、配列は角括弧 で囲まれ、要素はコンマとスペースで区切られる。要素が文字列の場合 が文字列の場合は、二重引用符で囲まれ、印字不可能な文字はエスケープされる。 文字はエスケープされる。
'r' 要素の並びは、それぞれ'r' でフォーマットされる。
複合 複合指定子の内部で指定された仕様に従ってフォーマットされた要素のシーケンス。 複合指定子の内部で指定される。
連想配列 's' 予測できない順序の要素のシーケンス。出力は で囲まれる。要素は カンマとスペースで区切られる。要素はkey:value のようにフォーマットされる。
複合 要素を予測できない順序で並べたもの。各要素 の内部で与えられた指定に従ってフォーマットされる。 compound指定子の内部で与えられた仕様に従ってフォーマットされる。最初の指定子は 最初の指定子はキーの書式設定に使われ、2番目の指定子は値の書式設定に使われる。 順序は位置引数で変更できる。例:" のようにする。 "%(%2$s (%1$s), %)" は値を書き、その後にキーを括弧で囲んで書く。 括弧で囲む。
列挙型 's' 値の名前。名前がない場合は、基本値 が使われ、その前にキャストが続く。
ただし's' 列挙型 "以外は、基本値で使用できるすべてのフォーマット文字でフォーマットできる。 でフォーマットすることができる。その場合、それらは基本値のようにフォーマットされる。
入力範囲 's' 範囲の要素が文字の場合、文字列のように記述される。 それ以外の場合、要素は角括弧で囲まれ、カンマとスペースで区切られる。 コンマとスペースで区切られる。
'r' 要素の並びは、それぞれ'r' でフォーマットされる。
複合 複合指定子の内部で指定された仕様に従ってフォーマットされた要素のシーケンス。 複合指定子の内部で指定された仕様に従ってフォーマットされた要素のシーケンス。
構造体 's' 構造体に該当する "構造体"がなく、入力範囲でもない場合、以下のようにフォーマットされる。toString も入力範囲もない場合、以下のようにフォーマットされる: StructType(field1, field2, ...).
クラス 's' クラスに適用可能なtoString も入力範囲もない場合、次のようにフォーマットされる。 としてフォーマットされる。
共用体(Union) 's' "共用体"に該当も入力範囲もない場合、そのベース名としてフォーマットされる。toString も入力範囲もない場合、そのベース名としてフォーマットされる。
ポインタ 's' nullポインタは'null'とフォーマットされる。その他のポインタは フォーマット文字'X' を使った16進数としてフォーマットされる。
'x','X' 16進数としてフォーマットされる。
SIMD ベクタ 's' 配列は角括弧 で囲まれ、要素はカンマとスペースで区切られる。
'r' 要素の並びは、それぞれ'r' でフォーマットされる。
複合 複合指定子の内部で指定された仕様に従ってフォーマットされた要素のシーケンス。 複合指定子の内部で指定された仕様に従ってフォーマットされた要素のシーケンス。
委任 's' 'r', 複合 このデリゲートの.stringof を文字列として扱う。
注釈: この実装は現在バグだらけである。 であり、その使用は推奨されない。

Authors:
Examples:
シンプルな使い方だ:
// 最も簡単な方法は、どこでも`%s`を使うことである:
// "I got 30 eggs for 5.27 euros."("卵30個を5.27ユーロで買った。")
writeln(format("I got %s %s for %s euros.", 30, "eggs", 5.27));

// 他の書式文字では、もっとコントロールできる:
// "I got 11110 65676773 for 5.270000 euros."("5.270000ユーロで11110 65676773を手に入れた")
writeln(format("I got %b %(%X%) for %f euros.", 30, "eggs", 5.27));
Examples:
複合指定子は、配列やその他の複合型をフォーマットすることができる:
/*
各項目の指定子に続くサブフォーマット文字列の末尾は、
配列の区切り文字として解釈されるため、
配列の最後の項目以降は省略される:
 */
    writeln(format("My items are %(%s %).", [1, 2, 3])); // "My items are 1 2 3."
    writeln(format("My items are %(%s, %).", [1, 2, 3])); // "My items are 1, 2, 3."

/*
区切り文字"%|"指定子は、
区切り文字がどこで始まるかを示すために使用することができ、
その場合、区切り文字より前のフォーマット文字列の部分は、最後の配列要素に保持される:
 */
    writeln(format("My items are %(-%s-%|, %).", [1, 2, 3])); // "My items are -1-, -2-, -3-."

/*
これらの複合書式指定子は、入れ子配列引数の場合、
入れ子にすることができる:
 */
    auto mat = [[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]];

    assert(format("%(%(%d %) - %)", mat), "1 2 3 - 4 5 6 - 7 8 9");
    assert(format("[%(%(%d %) - %)]", mat), "[1 2 3 - 4 5 6 - 7 8 9]");
    assert(format("[%([%(%d %)]%| - %)]", mat), "[1 2 3] - [4 5 6] - [7 8 9]");

/*
複合書式指定子の内部では、文字列と文字が自動的にエスケープされる。
この動作を避けるには、"%("の代わりに"%-("を使用する:
 */
    // `My friends are ["John", "Nancy"].`
    writeln(format("My friends are %s.", ["John", "Nancy"]));
    // `My friends are "John", "Nancy".`
    writeln(format("My friends are %(%s, %).", ["John", "Nancy"]));
    // `My friends are John, Nancy.`
    writeln(format("My friends are %-(%s, %).", ["John", "Nancy"]));
Examples:
パラメータを使用する:
// Flagsは結果に影響を与えるために使うことができる:
writeln(format("%g != %+#g", 3.14, 3.14)); // "3.14 != +3.14000"

// 幅と精度は、フォーマットされた結果を整えるのに役立つ:
writeln(format(">%10.2f<", 1234.56789)); // ">   1234.57<"

// 数字はグループ化できる:
writeln(format("%,4d", int.max)); // "21,4748,3647"

// 引数の位置を指定することも可能だ:
writeln(format("%3$s %1$s", 3, 17, 5)); // "5 3"
Examples:
引数としてパラメータを与える:
// 引数としての幅
writeln(format(">%*s<", 10, "abc")); // ">       abc<"

// 引数としての精度
writeln(format(">%.*f<", 5, 123.2)); // ">123.20000<"

// 引数としてのグループ化
writeln(format("%,*d", 1, int.max)); // "2,1,4,7,4,8,3,6,4,7"

// グループ分けのセパレーターを引数に取る
writeln(format("%,3?d", '_', int.max)); // "2_147_483_647"

// 一気に
writeln(format("%*.*,*?d", 20, 15, 6, '/', int.max)); // "   000/002147/483647"
class FormatException: object.Exception;
フォーマット中に問題が発生したことを示す。
Examples:
import std.exception : assertThrown;

assertThrown!FormatException(format("%d", "foo"));
pure nothrow @nogc @safe this();
汎用コンストラクタ。
pure nothrow @nogc @safe this(string msg, string fn = __FILE__, size_t ln = __LINE__, Throwable next = null);
FormatException の新しいインスタンスを作成する。
Parameters:
string msg 例外のメッセージ
string fn 例外が発生したファイルのファイル名 (オプション)
size_t ln 例外が発生したファイルの行番号 (オプション)
Throwable next 内部使用のため、常にNULLでなければならない (オプション)
immutable(Char)[] format(Char, Args...)(in Char[] fmt, Args args)
if (isSomeChar!Char);

typeof(fmt) format(alias fmt, Args...)(Args args)
if (isSomeString!(typeof(fmt)));
フォーマット文字列に従って引数を文字列に変換する。
2番目のバージョンの formatの第2バージョンは、フォーマット文字列をテンプレート 引数として受け取る。この場合、コンパイル時に整合性がチェックされる。 この場合、コンパイル時に整合性がチェックされ、出力バッファの長さを事前に推定できるため、若干高速なコードが生成される。 出力バッファの長さを事前に見積もることができるからだ。
Parameters:
Char[] fmt フォーマット文字列
Args args フォーマットされる引数の可変長引数リスト
Char 文字型 fmt
Args 引数の可変長引数リスト
Returns:
フォーマットされた文字列。
Throws:
A FormatExceptionフォーマットが成功しなかった場合
See Also:
sformatガベージコレクションを回避しようとする変種である。
Examples:
writeln(format("Here are %d %s.", 3, "apples")); // "Here are 3 apples."("ここに3個のリンゴがある。")

writeln("Increase: %7.2f %%".format(17.4285)); // "Increase:   17.43 %"
Examples:
フォーマット文字列はコンパイル時にチェックできる:
auto s = format!"%s is %s"("Pi", 3.14);
writeln(s); // "Pi is 3.14"

// 3.14は%dでフォーマットできないので、この行はコンパイルされない:
// s = format!"%s is %d"("Pi", 3.14);
char[] sformat(Char, Args...)(return scope char[] buf, scope const(Char)[] fmt, Args args);

char[] sformat(alias fmt, Args...)(char[] buf, Args args)
if (isSomeString!(typeof(fmt)));
フォーマット文字列に従って引数をバッファに変換する。 バッファは、フォーマットされた文字列を保持するのに十分な大きさでなければならない。
番目のバージョンの sformatの第2バージョンは、フォーマット文字列をテンプレート 引数として受け取る。この場合、コンパイル時に整合性がチェックされる。 コンパイル時にチェックされる。
Parameters:
char[] buf フォーマットされた文字列が入るべきバッファ
const(Char)[] fmt フォーマット文字列
Args args フォーマットされる引数の可変長引数リスト
Char 文字型 fmt
Args 引数の可変長引数リスト
Returns:
のスライス。 bufのスライス。
Throws:
以下の場合、RangeErrorとなる。 buf フォーマットされた文字列を保持するのに十分な大きさがない場合 を、そして FormatExceptionを返す。

注釈:理論的には、この関数は であるべきである。 理論的には、この関数は@nogc 。しかし、現在の の実装では、アロケーションが発生するケースがある:

  • 例外がスローされる。
  • 複合型のカスタム関数(toString )がアロケートする。

Examples:
char[20] buf;
writeln(sformat(buf[], "Here are %d %s.", 3, "apples")); // "Here are 3 apples."("ここに3個のリンゴがある。")

writeln(buf[].sformat("Increase: %7.2f %%", 17.4285)); // "Increase:   17.43 %"
Examples:
フォーマット文字列はコンパイル時にチェックできる:
char[20] buf;

writeln(sformat!"Here are %d %s."(buf[], 3, "apples")); // "Here are 3 apples."("ここに3個のリンゴがある。")

// 3.14は%dでフォーマットできないので、この行はコンパイルされない:
// writeln(sformat!"Here are %d %s."(buf[], 3.14, "apples"));