C#中的自定义字符串格式化

ser*_*0ne 5 c# string string-formatting iformatprovider iformattable

C#中的字符串格式;

我可以用吗?是.

我可以实现自定义格式吗?没有.

我需要写一些可以传递一组自定义格式选项的内容string.Format,这会对特定项目产生一些影响.

目前我有这样的事情:

string.Format("{0}", item);
Run Code Online (Sandbox Code Playgroud)

但我希望能够用这个项目做事:

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

我知道我可以做类似的事情.ToUpper(),.ToLower()但我需要用字符串格式化来做.

我一直在研究类似的事情IFormatProvider,IFormattable但我不知道它们是否应该是我应该使用的东西,或者,如何实现它们.

任何人都可以解释我如何解决这个问题?

理由(以防万一你想知道...)

我有一个小程序,我可以在其中输入逗号分隔的值集和模板.项目将string.Format与创建输出的模板一起传递.我想提供模板格式化选项,以便用户可以控制他们想要输出项目的方式.

Jcl*_*Jcl 10

您可以制作自定义格式化程序,例如:

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();
   }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它像:

 string.Format(new MyFormatter(),
            "{0:lcase}, {0:ucase}, {0:nospace}", 
            "My Test String")
Run Code Online (Sandbox Code Playgroud)

这应该返回:

我的测试字符串,MY TEST STRING,MyTestString