Поставщики форматов являются подключаемыми, но, насколько я знаю, вы не можете установить поставщика форматов по умолчанию для данного типа. Методы, которые принимают строки формата по соглашению, обычно также имеют перегрузку, которая принимает IFormatProvider. Вы можете реализовать два класса, таких как MyFormatProvider: IFormatProvider и MyCustomFormatter: ICustomFormatter .
При обработке строки форматирования, такой как "{0: dd} {0: or} {0: MMM} {0: yyyy}", ваш ICustomFormatter будет вызываться 4 раза с использованием "dd", "или" , "MMM" и "yyyy" в качестве параметров, поэтому он может форматировать каждую часть отдельно. Вам просто нужно обработать регистр «или» и передать остальное поставщику формата по умолчанию.
Однако при форматировании вызывающему абоненту все равно необходимо будет передать экземпляр вашего поставщика нестандартного формата. Например:
string str = String.Format(MyFormatProvider.Default, "{0:dd}{0:or} {0:MMM} {0:yyyy}", date);
Насколько я знаю, этого требования не избежать. Некоторое время назад я искал лучший способ, когда создал «относительную» строку формата DateTime, которая отображала бы такие значения DateTime, как «1 час назад», «3 дня назад» и т. Д. Не удалось найти способ избежать явного передать мой пользовательский IFormatProvider.