1. ホーム
  2. c#

String.Format - その仕組みとカスタム書式文字列の実装方法

2023-07-22 19:22:14

質問

String.Format() を使うと、例えば次のような書式が可能です。 DateTime オブジェクトを様々な方法でフォーマットすることができます。私は希望する書式を探すたびに、インターネットを探し回る必要があります。ほとんどの場合、私が使用できる例を見つけることができます。例えば

String.Format("{0:MM/dd/yyyy}", DateTime.Now);          // "09/05/2012"

しかし、これがどのように機能するのか、どのクラスがこれらの「魔法の」追加文字列をサポートするのか、手がかりがありません。

そこで質問です。

  1. どのように String.Format はどのように追加情報をマッピングするのでしょうか? MM/dd/yyyy を文字列の結果にマッピングしますか?
  2. すべての Microsoft オブジェクトがこの機能をサポートしていますか?

    これはどこかに文書化されていますか?
  3. このようなことは可能でしょうか。

    String.Format("{0:MyCustomFormat}", new MyOwnClass())

どのように解決するのですか?

String.Format は文字列の中の各トークンに対してマッチします ( {0} など) を、対応するオブジェクトに対してマッチさせます。 https://docs.microsoft.com/en-us/dotnet/api/system.string.format#overloads

フォーマット文字列はオプションで提供されます。

{ index[,alignment][ : formatString] }

もし formatString が指定された場合、対応するオブジェクトは IFormattable を実装し、特に ToString メソッドで formatString を受け取り、対応するフォーマットされた文字列を返します。 https://docs.microsoft.com/en-us/dotnet/api/system.iformattable.tostring

IFormatProvider は、基本的な書式の標準やデフォルトなどを取得するために使用されることもあります。例 ここで はこちら .

では、質問の答えを順番に。

  1. これは IFormattable インターフェースの ToString() メソッドを DateTime オブジェクトを作成し、その MM/dd/yyyy の書式文字列を渡します。正しい文字列を返すのはその実装です。

  2. を実装したオブジェクトは IFormattable を実装したオブジェクトは、この機能をサポートします。自分で書くこともできます!

  3. はい、上記をご覧ください。