Пользовательский форматировщик строки в C#

Форматирование строки в 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() и т.д., но мне нужно сделать это с форматированием строки.

Я изучал такие вещи, как IFormatProvider а также IFormattable но я действительно не знаю, являются ли они тем, что я должен использовать, или как их реализовать.

Может кто-нибудь объяснить, как я могу решить эту проблему?

Обоснование (на всякий случай, если вы хотите знать...)

У меня есть небольшая программа, в которой я могу ввести набор значений через запятую и шаблон. Предметы передаются в string.Formatвместе с шаблоном, который создает вывод. Я хочу предоставить параметры форматирования шаблона, чтобы пользователь мог контролировать способ вывода элементов.

1 ответ

Решение

Вы можете сделать собственный форматировщик, что-то вроде:

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

Другие вопросы по тегам