10

C# での文字列の書式設定。

使用できますか?はい。

カスタム書式設定を実装できますか? いいえ。

string.Format特定のアイテムに何らかの影響を与える一連のカスタム書式設定オプションを に渡すことができる何かを記述する必要があります。

現時点では、次のようなものがあります。

string.Format("{0}", item);

しかし、私はそのアイテムで何かをしたいと思っています:

string.Format("{0:lcase}", item); // lowercases the item
string.Format("{0:ucase}", item); // uppercases the item
string.Format("{0:nospace}", item); // removes spaces

.ToUpper()などのことができることはわかって.ToLower()いますが、文字列の書式設定で行う必要があります。

私はIFormatProviderandのようなものを調べてきましたIFormattableが、それらが私が使用すべきものであるか、またはそれらを実装する方法であるかどうかはよくわかりません。

この問題を解決する方法を誰か説明できますか?

根拠(知りたい場合に備えて...)

コンマで区切られた一連の値とテンプレートを入力できる小さなプログラムがあります。string.Format項目は、出力を作成するテンプレートとともに に渡されます。ユーザーがアイテムの出力方法を制御できるように、テンプレートの書式設定オプションを提供したいと考えています。

4

1 に答える 1

14

次のようなカスタム フォーマッタを作成できます。

public class MyFormatter : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }

   public string Format(string fmt, object arg, IFormatProvider formatProvider) 
   {
       if(arg == null) return string.Empty;

       if(fmt == "lcase")
           return arg.ToString().ToLower();
       else if(fmt == "ucase")
           return arg.ToString().ToUpper();
       else if(fmt == "nospace")
           return arg.ToString().Replace(" ", "");
       // Use this if you want to handle default formatting also
       else if (arg is IFormattable) 
           return ((IFormattable)arg).ToString(fmt, CultureInfo.CurrentCulture);
       return arg.ToString();
   }
}

次に、次のように使用します。

 string.Format(new MyFormatter(),
            "{0:lcase}, {0:ucase}, {0:nospace}", 
            "My Test String")

これは次のように返されます。

私のテスト文字列、MY TEST STRING、MyTestString

于 2016-02-23T12:12:02.403 に答える