コンテンツにスキップ

テキスト整形

すべてのテキスト整形式は、式エンジンを「文字列補間」モードに切り替えるプレフィックス format:: で始まります。これは、テキスト値に評価されることを意図した式でのみ意味があります。すべての整形式は複数行を許可します。

format 式に直接入力されたテキストは、出力にそのまま表示されます。たとえば式 format::Hello world は、変更なしでテキスト「Hello world」になります。

format 式を有用にするために、文字列補間を使ってテキスト内に式を埋め込みます。これは、テキストに 置換フィールド を挿入することで行います。たとえば format::Running for {uptime / 60}min は「Running for 20.563min」になります(システムが約 20 分実行されていた場合)。

通常、コンピューターで定義された値を扱うとき、式の作成者が含めたくない余分な詳細が多くあります。上記の例では、整数の分の後の余分な小数点以下はおそらく不要です。これを修正するために、作成者は置換フィールドを含めて内容の整形方法を変えられます。format::Running for {uptime / 60:.0f}min は、望みどおり「Running for 20min」になります。

format:: プレフィックスを含まない式で駆動されるテキストフィールドは、デフォルトの整形規則を使って結果を単純にテキストに変換します。場合によっては、結果をテキストに変換できないことがあります(たとえば関数名単独では、テキストに変換できる値に評価されません)。これは式エラーになります。

整形は C++ の std::format と同じ言語を使います。

置換フィールドは、それを囲む波かっこ({})で識別されます。式の作成者がテキストをリテラルの {} で囲む必要がある場合は、かっこを二重にします。たとえば: format::{{ hello, no evaluation happens here }} -> {{ hello, no evaluation happens here }}

置換フィールド内では、通常の式評価構文を使って、関数の呼び出し、変数の読み取り、演算子の使用、その他すべての式で利用できるものを行えます。

さらに、式構文の後に、オプションの : をフィールドに追加します。これは式を書式指定から分離し、値をテキストに変換する方法を制御します。

テキスト整形システムの強みは、値をテキストに変換する方法を細かく制御できることです。これは、一般的なテキスト整形操作のコンパクトな表現に焦点を当てた小さな DSL(ドメイン固有言語)によって実現されます。

特定の文字数内でテキストを埋めて揃えると便利なことがあります。

揃えと埋めの動作には一連のデフォルトがあります。デフォルトの埋めはスペース( )で、デフォルトの揃えは右です。デフォルトでは、この埋めや揃えを適用する幅はありません。

ここでのすべての整形例では、置換フィールドの正確な動作を明確にするため、置換フィールドを一重引用符で囲みます。これは通常の使用では不要です。

したがって、次のすべての式は同一のテキスト「’   123’」になります。

  • format::'{123:6}'
  • format::'{123:>6}'
  • format::'{123: >6}'

:> の間のスペースは 埋め 文字です。上記の最後の例では、これを任意の別の 1 文字に置き換えられます(たとえば format::'{123:x>6}' は「‘xxx123’」になります)。

同様に、> 文字は 揃え 演算子で、次のいずれかになります:

  • > - 右揃え(format::'{123:x>6}' -> 「‘xxx123’」)
  • < - 左揃え(format::'{123:x<6}' -> 「‘123xxx’」)
  • ^ - 中央揃え(format::'{123:x^6}' -> 「‘x123xx’」)

最後に、6 で、任意の整数にできます。幅が値を表すのに必要な文字数より小さく指定されている場合、幅は無視されます。

通常、これらの演算子の順序は非常に重要ですが、1 つの例外があります。埋め文字が 0 のとき、揃え演算子を省略できます。つまり format::'{123:06}' は「‘000123’」になります。なお、他に数値の埋め文字はありません。format::'{123:16}' と書こうとすると、1 文字で 6 文字幅を埋めるのではなく、16 文字幅になります。

ここの例では整数値を使っていますが、文字列と浮動小数点値もこの機能で動作します。例: format::'{"hello":^10s}' -> 「’  hello   ’」

上記の に加えて、小数点以下の桁を持つ数値には、精度 指定子により、作成者は提示される詳細の量を制限できます。

精度は、オプションの の後のピリオド . に続く数値です。常に浮動小数点指定子 f または g(後述)が続く必要があります。例:

format::'{123.456:.1f}' -> 「‘123.5’」(丸めが正しいことに注意)

幅は意味を変えたり、小数点前の桁数に影響したりすることはありません。

たとえば format::'{123.456:1.1f}' -> 「‘123.5’」ですが、 をフィールド置換がレンダリングした 5 文字を超えて拡張すると、上記のとおりパディングが挿入され始めます。format::'{123.456:6.1f}' -> 「’ 123.5’」。上記のすべての埋めと揃えの規則が等しく適用されます。精度は指定された数値に対してレンダリングされるテキストを変え、幅・埋め・揃えは指定された 文字内でどこに提示されるかを調整します。

幅の前(または幅なしで単独で)に + を挿入すると、数値の符号が常に書かれるようになります。例: format::'{123:+6}' は「’   +123’」になり、format::'{-123}' は常に「‘-123’」になります。format::'{123:+}' は「‘+123’」になります。

- も有効な符号演算子ですが、これはデフォルトの動作が何らかの形で期待どおりであることを示すだけです。

一部の型(後述)では、整形される整数の基数が変わります。標準の 基数プレフィックス を使って数値の基数を識別すると便利なことがよくあります。これは、 の前に # 文字を挿入することで行います。詳しくは 整数型 をご覧ください。

型指定子は書式指定の最後の文字です。式が評価される値の型に基づいて、その値の表現を、さまざまな状況で有用になるよう変えられます。

そのため、型指定子は、式が評価される値の型に基づいてセクションに分類されます:

  • b または B(基数プレフィックス: 「0b」または「0B」)。整数を 2 進数(基数 2)として整形します。例: format::'{256:#16b}' -> 「‘0b0000000100000000’」
  • o(基数プレフィックス: 「0」)。整数を 8 進数(基数 8)として整形します。例: format::'{256:#o}' -> 「‘0400’」
  • x または X(基数プレフィックス: 「0x」または「0X」)。整数を 16 進数(基数 16、文字 0-9 と a-f を使用)として整形します。例: format::'{256:#x}' -> 「‘0x100’」
  • d(基数プレフィックスなし)。デフォルトの動作で、指定する必要はありません。整数を 10 進数(基数 10)として整形します。例: format::'{256:#d}' -> 「‘256’」
  • g - デフォルトの動作(型や書式指定をまったく指定しないときに使われます)。数値をコンパクトな表現で、精度 文字まで整形します。数値が 10 進表記で 精度(デフォルト 6)文字を超えると、科学的表記に切り替わり丸められます。例: format::'{1.5:g}' -> 「‘1.5’」
  • f - 科学的(指数)表記を使わない「固定」整形で整形します。例: format::'{1.5:f}' -> 「‘1.500000’」 精度 でこの書式オプションの結果を調整できます。
  • a - 精密な機械可読の 16 進整形で整形します。一部のコンピューターシステムが、文字列変換による精度損失なしに浮動小数点数を転送するために使います。例: format::'{1.5:a}' -> 「‘0x1.8p+0’」
  • s - デフォルトの動作。テキストを提供されたまま単純にレンダリングして整形します。例: format::'{"hi\nthere":s}' -> 「‘hi
    there’」
  • ? - エスケープと引用符付きでテキストを整形します。奇妙な文字がある場合や、文字列が予期しないものである場合に便利です。例: format::'{"hi\nthere":?}' -> 「‘“hi\nthere”’」