String.Format()
Например, с его помощью можно форматировать DateTime
объекты множеством различных способов. Каждый раз, когда я ищу желаемый формат, мне нужно поискать в Интернете. Почти всегда я нахожу пример, который могу использовать. Например:
String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012"
Но я понятия не имею, как это работает и какие классы поддерживают эти «волшебные» дополнительные строки.
Итак, мои вопросы:
- Как
String.Format
сопоставлять дополнительную информациюMM/dd/yyyy
со строковым результатом? - Все ли объекты Microsoft поддерживают эту функцию?
Это где-то задокументировано? - Можно ли сделать что-то подобное:
String.Format("{0:MyCustomFormat}", new MyOwnClass())
Ответы:
String.Format
сопоставляет каждый из токенов внутри строки (и{0}
т. д.) с соответствующим объектом: http://msdn.microsoft.com/en-us/library/system.string.format.aspxНеобязательно предоставляется строка формата:
{ index[,alignment][ : formatString] }
Если
formatString
предоставляется, соответствующий объект должен реализовывать IFormattable и, в частности,ToString
метод, который принимаетformatString
и возвращает соответствующую отформатированную строку: http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspxТакже
IFormatProvider
может использоваться, который может использоваться для захвата основных стандартов форматирования / значений по умолчанию и т. Д. Примеры здесь и здесь .Итак, ответы на ваши вопросы по порядку:
Он использует
IFormattable
интерфейсToString()
метод наDateTime
объекте и передает его вMM/dd/yyyy
строке формата. Это та реализация, которая возвращает правильную строку.Любой реализующий объект
IFormattable
поддерживает эту функцию. Вы даже можете написать свой собственный!Да, смотрите выше.
источник
IFormattable
, где я могу найти разрешенные строки формата. Например DateTime поддерживает (над моей головой)y M d h m s
и многое другое. Числовые типы поддерживаются вC
валюте, но это не все, что я знаю из поиска по arround, а не из документации Microsoft.Насколько я понимаю, вам нужно будет реализовать IFormattable в своем классе для поддержки этого. Затем у него есть метод ToString, который принимает параметры, которые вы передаете в String.Format.
Вот пример.
// Define other methods and classes here public class Sample : IFormattable { public string ToString(string format, IFormatProvider provider) { return String.Concat("Your custom format was ", format); } } String.Format("{0:MyCustomFormat}", new Sample())
источник
Ознакомьтесь с официальными документами MSDN, здесь есть полный список строк формата DateTime: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx . «Волшебных» струн действительно немало.
Насколько я знаю, не все типы имеют "интересное" форматирование, но все типы поддерживаются
ToString()
. Если вам нужно отформатировать встроенный объект, вы можете добавить для этого метод расширения, но обычно форматирование предоставляется в любом месте, где оно необходимо (или, другими словами, я написал только собственные средства форматирования для своих типов) .Да, вы можете написать свои собственные, и если у вас есть данные, которые можно форматировать по-разному, вам, вероятно, следует написать собственный форматировщик, реализовав IFormattable, снова см. Документы здесь: http://msdn.microsoft.com/en-us/ библиотека / system.iformattable.aspx . Это довольно просто, вы просто проверяете предоставленные строки и записываете свои данные на их основе, за кулисами нет никакой магии :-)
источник
Под обложками String.Format делает следующее:
IFormattable formattable = objectToFormat as IFormattable; if (formattable != null) { formattable.ToString(objectToFormat); } else { objectToFormat.ToString(); }
По вашим вопросам,
Как String.Format сопоставляет дополнительную информацию MM / dd / yyyy со строковым результатом?
Как указано выше, он просто вызывает IFormattable .ToString (строковый формат, поставщик IFormatProvider). Провайдер часто говорит вам, какова культура вашей системы. Часто null, потому что люди не передают его String.Format (), как вы это делали в вашем случае.
Все ли объекты Microsoft поддерживают эту функцию? Это где-то задокументировано?
Все, что реализует IFormattable, делает.
Можно ли сделать что-то подобное:
String.Format("{0:MyCustomFormat}, new MyOwnClass())
По сути, если вы хотите, чтобы ваш собственный объект что-то делал с предоставленным вами форматом
IFormattable
.Существует огромное количество поддерживающих классов и перечислителей, чтобы гарантировать, что строки формата во многом схожи. Подробнее здесь .
источник
Да, это возможно - это можно полностью настроить. Посмотрите эту ссылку на документацию о настраиваемом форматировании даты и времени.
Если у вас есть собственный объект, вы должны переопределить
ToString()
метод и вывести то, что вы считаете подходящим представлением. Как только вы это сделаете, вы можете использовать,String.Format("{0:MyCustomFormat}", new MyOwnClass())
потому что это неявно вызываетMyOwnClass.ToString()
источник
DateTime
форматировании. И просто ссылка - это не ответ.Документацию по датам можно найти здесь: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
Это должно точно сказать вам, что означают все символы форматирования даты, такие как MM.
Если вы хотите изменить способ вывода строки для настраиваемого класса, вы можете переопределить метод ToString, например:
public class User { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return this.Name + " is " + this.Age + " years old."; } }
а затем вы можете просто сделать что-то вроде
myUser.ToString()
и получить указанный вами результат.источник
И чтобы ответить на ваш третий вопрос: это невозможно с этим синтаксисом, но вы можете предоставить экземпляры
IFormatProvider
иICustomFormatter
для типа, который вы не создавали или не реализовывалиIFormattable
внутри своего типа (хотя в основном это расширяетсяToString
).источник