Пользовательский форматировщик строки в 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