80

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())
4

7 に答える 7

89

String.Format{0}文字列(など)内の各トークンを対応するオブジェクトと照合します: https ://docs.microsoft.com/en-us/dotnet/api/system.string.format#overloads

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

{ index[,alignment][ : formatString] }

提供されている場合formatString、対応するオブジェクトはIFormattableを実装する必要があり、具体的には、対応するフォーマットされた文字列ToStringを受け入れて返すメソッドを実装する必要があります: https ://docs.microsoft.com/en-us/dotnet/api/system.iformattable.tostringformatString

AnIFormatProviderは、基本的なフォーマット標準/デフォルトなどをキャプチャするためにも使用できます。ここここの例。

だからあなたの質問への答えは順番に:

  1. オブジェクトに対してIFormattableインターフェースのToString()メソッドを使用し、そのフォーマット文字列を渡します。正しい文字列を返すのはその実装です。DateTimeMM/dd/yyyy

  2. 実装するすべてのオブジェクトがIFormattableこの機能をサポートします。あなたもあなた自身を書くことができます!

  3. はい、上記を参照してください。

于 2012-05-09T08:27:42.170 に答える
20

私の理解では、これをサポートするには、クラスにIFormattableを実装する必要があります。次に、String.Formatに渡したパラメーターを受け取るメソッドToStringがあります。

これが例です。

// Define other methods and classes here
public class Sample : IFormattable
{
     public string ToString(string format, IFormatProvider provider)
     {
         return String.Concat("Your custom format was ", format);
     }
}

String.Format("{0:MyCustomFormat}", new Sample())
于 2012-05-09T08:26:09.570 に答える
5
  1. 公式のMSDNドキュメントを確認してください。DateTime形式の文字列の完全なリストはここにあります:http://msdn.microsoft.com/en-us/library/az4se3k1.aspx。確かにかなりの数の「魔法の」文字列があります。

  2. 私の知る限り、すべてのタイプに「興味深い」フォーマットがあるわけではありませんが、すべてのタイプがをサポートしていToString()ます。組み込みオブジェクトをフォーマットする必要がある場合は、拡張メソッドを追加してそれを行うことができますが、通常、フォーマットは必要な場所で提供されます(言い換えると、私は自分のタイプのカスタムフォーマッターのみを作成しました) 。

  3. はい、独自に作成できます。さまざまな方法でフォーマットできるデータがある場合は、IFormattableを実装してカスタムフォーマッターを作成する必要があります。ここでもドキュメントを参照してください:http://msdn.microsoft.com/en-us/ library/system.iformattable.aspx。それはかなり簡単です、あなたは単に提供された文字列をチェックし、これらに基づいてあなたのデータを書き出すだけです、舞台裏で魔法はありません:-)

于 2012-05-09T08:28:21.237 に答える
4

カバーの下で String.Format は次のように処理します。

IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
    formattable.ToString(objectToFormat);
}
else
{
    objectToFormat.ToString();
}

ご質問については、

  1. String.Format は追加情報 MM/dd/yyyy を文字列の結果にどのようにマップしますか?

    上で指定したように、IFormattable .ToString(string format, IFormatProvider provider) を呼び出すだけです。プロバイダーは、多くの場合、システムのカルチャが何であるかを示すものです。多くの場合、null は、あなたの場合のように String.Format() を渡さないためです。

  2. すべての Microsoft オブジェクトがこの機能をサポートしていますか? これはどこかに文書化されていますか?

    IFormattable を実装するものはすべて実行します。

  3. 次のようなことは可能ですか?String.Format("{0:MyCustomFormat}, new MyOwnClass())

    基本的に、独自のオブジェクトに、提供された形式で何かを実行させたい場合は、実装しIFormattableます。

フォーマット文字列がほぼ同じであることを確認するために、膨大な数のサポート クラスと列挙子があります。 詳細はこちら

于 2012-05-09T08:32:22.577 に答える
0

日付のドキュメントはここにあります:http: //msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

これにより、MMなどのすべての日付書式文字の意味が正確にわかります。

カスタムクラスの文字列の出力方法を変更する場合は、次のようにToStringメソッドをオーバーライドできます。

public class User
{
     public string Name { get; set; }
     public int Age { get; set; }

     public override string ToString()
     {
         return this.Name + " is " + this.Age + " years old.";
     }
}

次に、次のようなことを実行してmyUser.ToString()、指定した出力を取得できます。

于 2012-05-09T08:26:22.323 に答える
0

3 番目の質問に答えるには、この構文では不可能ですが、作成していない型のインスタンスを提供したり、型内に実装したりできIFormatProviderます(ただし、基本的には を拡張します)。ICustomFormatterIFormattableToString

于 2012-05-09T08:29:45.110 に答える
0

はい、可能です。完全にカスタマイズできます。日付と時刻のカスタム書式設定でこれを見てください。

独自のオブジェクトがある場合、ToString()メソッドをオーバーライドして、適切な表現であると思われるものを出力するのはあなた次第です。String.Format("{0:MyCustomFormat}", new MyOwnClass())これを行うと、暗黙的に呼び出すため、使用できますMyOwnClass.ToString()

于 2012-05-09T08:24:42.383 に答える