программирование. Руководство su P# a n Reference в herbert schildt полное руководство с 0 герберт шилдт
Скачать 3.32 Mb.
|
X Шестнадцатеричный (в обозначении Задает минимальное количество используются прописные буквы A‑F) цифр. При необходимости результат дополняется начальными нулями X Шестнадцатеричный (в обозначении Задает минимальное количество используются строчные буквы A‑F) цифр. При необходимости результат дополняется начальными нулями Как пояснялось выше, конкретное действие спецификаторов формата зависит от текущих настроек параметров культурной среды. Например, спецификатор денежной единицы С автоматически отображает числовое значение в формате денежной единицы, выбранном для локализации программного обеспечения в конкретной культурной среде. Для большинства пользователей используемая по умолчанию информация о культурной среде соответствует их региональным стандартам и языковым особенностям. Поэтому один и тот же спецификатор формата может использоваться без учета культурного контекста, в котором выполняется программа. В приведенной ниже программе демонстрируется применение нескольких спецификаторов формата числовых данных. // Продемонстрировать применение различных // спецификаторов формата числовых данных. using System; class FormatDemo { static void Main() { double v = 17688.65849; double v2 = 0.15; int x = 21; Console.WriteLine("{0:F2}", v); Console.WriteLine("{0:N5}", v); Console.WriteLine ("{0:e}", v); Console.WriteLine("{0:r}", v); Console.WriteLine("{0:p}", v2); Console.WriteLine("{0:X}", x); Console.WriteLine("{0:D12}", x); Console.WriteLine("{0:C}", 189.99); } } Эта программа дает следующий результат. 17688.66 17.688.65849 1.768866е+004 17688.65849 15.00 % 15 000000000021 $189.99 Обратите внимание на действие спецификатора точности в нескольких форматах. Представление о номерах аргументов Следует иметь в виду, что аргумент, связанный со спецификатором формата, определяется номером аргумента, а не его позицией в списке аргументов. Это означает, что один и тот же аргумент может указываться неоднократно в одном вызове метода WriteLine(). Эта также означает, что аргументы могут отображаться в той последовательности, в какой они указываются в списке аргументов. В качестве примера рассмотрим следующую программу. using System; class FormatDemo2 { static void Main() { // Форматировать один и тот же аргумент тремя разными способами. Console.WriteLine("{0:F2} {0:F3} {0:е}", 10.12345); // Отобразить аргументы не по порядку. Console.WriteLine("{2:d} {0:d} {l:d}", 1, 2, 3) ; } } Ниже приведен результат выполнения этой программы. 10.12 10.123 1.012345е+001 3 12 В первом операторе вызова метода WriteLine () один и тот же аргумент 10.12345 форматируется тремя разными способами. Это вполне допустимо, поскольку каждый спецификатор формата в этом вызове обозначает первый и единственный аргумент. А во втором вызове метода WriteLine () три аргумента отображаются не по порядку. Не следует забывать, что каких‑то особых правил, предписывающих обозначать аргументы в спецификаторах формата в определенной последовательности, не существует. Любой спецификатор формата может обозначать какой угодно аргумент. Применение методов String. Format () и ToString () для форматирования данных Несмотря на все удобства встраивания команд форматирования выводимых данных в вызовы метода WriteLine () , иногда все же требуется сформировать строку, содержащую отформатированные данные, но не отображать ее сразу. Это дает возможность отформатировать данные заранее, чтобы вывести их в дальнейшем на выбранное устройство. Такая возможность особенно полезна для организации работы в среде с графическим пользовательским интерфейсом, подобной Windows, где ввод‑вывод на консоль применяется редко, а также для подготовки вывода на веб‑страницу. Вообще говоря, отформатированное строковое представление отдельного значения может быть получено двумя способами. Один из них состоит в применении метода String. Format () , а другой – в передаче спецификатора формата методу ToStringO, относящемуся к одному из встроенных в C# числовых типов данных. Оба способа рассматриваются далее по порядку. Применение метода String. Format () для форматирования значений Для получения отформатированного значения достаточно вызвать метод Format (), определенный в классе String, в соответствующей его форме. Все формы этого метода перечислены в табл. 22.5. Метод Format () аналогичен методу WriteLine (), за исключением того, что он возвращает отформатированную строку, а не выводит ее на консоль. Метод Описание public static string Форматирует объект argO в соответствии с первой ко Format (string format, мандой форматирования, которая содержится в строке obj ect argO) format. Возвращает копию строки format , в которой команда форматирования заменена отформатированными данными public static string Форматирует объект argO в соответствии с первой Format (string format, командой форматирования, содержащейся в строке object argO, object argl) format , а объект argl – в соответствии со второй командой. Возвращает копию строки format , в которой команды форматирования заменены отформатированными данными public static string Форматирует объекты argO, argl и агд2 по соответ Format (string format, ствующим командам форматирования, содержащимся obj ect argO, object argl, в строке format. Возвращает копию строки format , в obj ect arg2) которой команды форматирования заменены отформатированными данными public static string Форматирует значения, передаваемые в массиве args, Format (string format, в соответствии с командами форматирования, содержа params object[] args) щимися в строке format. Возвращает копию строки format , в которой команды форматирования заменены отформатированными данными public static string Форматирует значения, передаваемые в массиве args , Format (IFormatProvider в соответствии с командами форматирования, содержа provider , string format, щимися в строке format , используя поставщик фор params object[] args) мата provider. Возвращает копию строки format, в которой команды форматирования заменены отформатированными данными Ниже приведен вариант предыдущего примера программы форматирования, измененный с целью продемонстрировать применение метода String . Format (). Этот вариант дает такой же результат, как и предыдущий. // Использовать метод String.Format() для форматирования значений, using System; class FormatDemo { static void Main() { double v = 17688.65849; double v2 = 0.15; int x = 21; string str = String.Format("{0:F2}", v); Console.WriteLine(str) ; str = String.Format("{0:N5}", v); Console.WriteLine(str); str = String.Format("{0:e}", v); Console.WriteLine(str); str = String.Format("{0:r}", v); Console.WriteLine (str); str = String.Format("{0:p}", v2); Console.WriteLine(str); str = String.Format("{0:X}", x) ; Console.WriteLine(str); str = String.Format("{0:D12}", x) ; Console.WriteLine(str); str = String.Format("{0:C}", 189.99); Console.WriteLine (str); } } Аналогично методу WriteLine (), метод String. Format () позволяет встраивать в свой вызов обычный текст вместе со спецификаторами формата, причем в вызове данного метода может быть указано несколько спецификаторов формата и значений. В качестве примера рассмотрим еще одну программу, отображающую текущую сумму и произведение чисел от 1 до 10. // Еще один пример применения метода Format(). using System; class FormatDemo2 { static void Main() { int i; int sum = 0; int prod = 1; string str; /* Отобразить текущую сумму и произведение чисел от 1 до 10. */ for(i=l; i <= 10; i++) { sum += i; prod *= i; str = String.Format("Сумма:{0,3:D} Произведение:{1,8:D}", sum, prod); Console.WriteLine(str); } Сумма: 45 Произведение: 362880 Сумма: 55 Произведение: 3628800 Обратите особое внимание в данной программе на следующий оператор. str = String.Format("Сумма:{0,3:D} Произведение:{1,8:D}", sum, prod); В этом операторе содержится вызов метода Format () с двумя спецификаторами формата: одним – для суммы (в переменной sum), а другим – для произведения (в переменной prod). Обратите также внимание на то, что номера аргументов указываются таким же образом, как и в вызове метода WriteLine(),n что в вызов метода Format () включается обычный текст, как, например, строка "Сумма : ". Этот текст передается данному методу и становится частью выводимой строки. Применение метода ToString () для форматирования данных Для получения отформатированного строкового представления отдельного значения любого числового типа, которому соответствует встроенная структура, например Int32 или Double, можно воспользоваться методом ToString (). Этой цели служит приведенная ниже форма метода ToString(). public string ToString("форматирующая строка") В этой форме метод ToString () возвращает строковое представление вызывающего объекта в том формате, который определяет спецификатор "форматирующая строка", передаваемый данному методу. Например, в следующей строке кода формируется строковое представление значения 188.99 в формате денежной единицы с помощью спецификатора формата С. string str = 189.99.ToString("С"); Обратите внимание на то, что спецификатор формата передается методу ToString () непосредственно. В отличие от встроенных команд форматирования, используемых в вызовах методов WriteLine () и Format (), где для этой цели дополнительно указываются номер аргумента и ширина поля, в вызове метода ToString () достаточно указать только спецификатор формата. Ниже приведен вариант примера предыдущей программы форматирования, измененный с целью продемонстрировать применение метода ToString () для получения отформатированных строк. Этот вариант дает такой же результат, как и предыдущий. // Использовать метод ToString() для форматирования значений. using System; class ToStringDemo { static void Main() { double v = 17688.65849; double v2 = 0.15; int x = 21; string str = v.ToString("F2") ; Console.WriteLine(str); str = v.ToString("N5"); Console.WriteLine(str); str = v.ToString("e"); Console.WriteLine(str); str = v.ToString("r"); Console.WriteLine(str); str = v2.ToString("p"); Console.WriteLine(str); str = x.ToString("X"); Console.WriteLine(str); str = x.ToString("D12"); Console.WriteLine(str); str = 189.99.ToString("C"); Console.WriteLine(str); } } Определение пользовательского формата числовых данных Несмотря на всю полезность предопределенных спецификаторов формата числовых данных, в C# предоставляется также возможность определить пользовательский, т.е. свой собственный, формат, используя средство, называемое форматом изображения . Своим происхождением термин формат изображения обязан тому обстоятельству, что специальный формат пользователь определяет, задавая пример внешнего вида (т.е. изображение) выводимых данных. Такой подход вкратце упоминался в части I этой книги, а здесь он рассматривается более подробно. Символы‑заполнители специального формата числовых данных I Когда пользователь определяет специальный формат, он задает этот формат в виде примера (или изображения) того, как должны выглядеть выводимые данные. Для этой цели используются символы, перечисленные в табл. 22.6. Они служат в качестве заполнителей и рассматриваются далее по очереди. Символ точки обозначает местоположение десятичной точки. Символ‑заполнитель # обозначает цифровую позицию, или разряд числа. Этот символ может указываться слева или справа от десятичной точки либо отдельно. Так, если справа от десятичной точки указывается несколько символов #, то они обозначают количество отображаемых десятичных цифр в дробной части числа. При необходимости форматируемое числовое значение округляется. Когда же символы # указываются слева от десятичной точки, то они обозначают количество отображаемых десятичных цифр в целой части числа. При необходимости форматируемое числовое значение дополняется начальными нулями. Если целая часть числового значения состоит из большего количества цифр, чем количество указываемых символов #, то она отображается полностью, но в любом случае целая часть числового значения не усекается. В отсутствие десятичной точки наличие символа # обусловливает округление соответствующего целого значения. А нулевое значение, которое не существенно, например конечный нуль, не отображается. Правда, это обстоятельство несколько усложняет дело, поскольку при указании такого формата, как # . # #, вообще ничего не отображается, если форматируемое числовое значение равно нулю. Для вывода нулевого значения служит рассматриваемый далее символ‑заполнитель 0. Таблица 22.6. Символы‑заполнители специального формата числовых данных Символ‑заполнитель Назначение # Цифра Десятичная точка , Разделитель групп разрядов % Процент 0 Используется для дополнения начальными и конечными нулями ; Выделяет разделы, описывающие формат для положительных, отрицательных и нулевых значений Е0 Е+0 Е‑0 еО е+0 е‑0 Экспоненциальное представление чисел Символ‑заполнитель 0 обусловливает дополнение форматируемого числового значения начальными или конечными нулями, чтобы обеспечить минимально необходимое количество цифр в строковом представлении данного значения. Этот символ может указываться как слева, как и справа от десятичной точки. Например, следующая строка кода: Console.WriteLine("{0:00##.#00}", 21.3); выводит такой результат. 0021.300 Значения, состоящие из большего количества цифр, будут полностью отображаться слева от десятичной точки, а округленные – справа. При отображении больших числовых значений отдельные группы цифр могут отделяться друг от друга запятыми, для чего достаточно вставить запятую в шаблон, состоящий из символов #. Например, следующая строка кода: Console.WriteLine("{0:#,###.#}", 3421.3); выводит такой результат. 3,421.3. Указывать запятую на каждой позиции совсем не обязательно. Если указать запятую в шаблоне один раз, то она будет автоматически вставляться в форматируемом числовом значении через каждые три цифры слева от десятичной запятой. Например, следующая строка кода: Console.WriteLine ("{0:#,###.#}", 8763421.3); дает такой результат. 8,763,421.3. У запятой имеется и другое назначение. Если запятая вставляется непосредственно перед десятичной точкой, то она выполняет роль масштабного коэффициента. Каждая запятая делит форматируемое числовое значение на 1000. Например, следующая строка кода: Console.WriteLine("Значение в тысячах: {0:#,###,.#}", 8763421.3); дает такой результат. Значение в тысячах: 8,763.4 Как показывает приведенный выше результат, числовое значение выводится масштабированным в тысячах. Помимо символов‑заполнителей, пользовательский спецификатор формата может содержать любые другие символы, которые появляются в отформатированной строке без изменения на тех местах, где они указаны в спецификаторе формата. Например, при выполнении следующего фрагмента кода: Console.WriteLine("КПД топлива: {0:##.# миль на галлон }", 21.3); выводится такой результат. КПД топлива: 21.3 миль на галлон При необходимости в форматируемой строке можно также указывать такие управляющие последовательности, как \t или \п. Символы‑заполнители Е и е обусловливают отображение числовых значений в экспоненциальном представлении. В этом случае после символа Е или е должен быть указан хотя бы один нуль, хотя их может быть и больше. Нули обозначают количество отображаемых десятичных цифр. Дробная часть числового значения округляется в соответствии с заданным форматом отображения. Если указывается символ Е, то он отображается прописной буквой "Е". А если указывается символ е, то он отображается строчной буквой "е". Для того чтобы знак порядка отображался всегда, используются формы Е+ или е+. А для отображения знака порядка только при выводе отрицательных значений служат формы Е, е, Е‑ или е‑. Знак ; служит разделителем в различных форматах вывода положительных, отрицательных и нулевых значений. Ниже приведена общая форма пользовательского спецификатора формата, в котором используется знак ;. положительный_формат ; отрицательный_формат ; нулевой_формат Рассмотрим следующий пример. Console.WriteLine("{0:#.##; (#.##);0.00}", num); Если значение переменной num положительно, то оно отображается с двумя разрядами после десятичной точки. Если же значение переменной num отрицательно, то оно также отображается с двумя разрядами после десятичной точки, но в круглых скобках. А если значение переменной num равно нулю, то оно отображается в виде строки 0. 00. Когда используются разделители, указывать все части приведенной выше фррмы пользовательского спецификатора формата совсем не обязательно. Так, если требуется вывести только положительные или отрицательные значения, нулевой_ формат можно опустить. (В данном случае нуль форматируется как положительное значение.) С другой стороны, можно опустить отрицательный_формат. И в этом случае положительный_формат и нулевой_формат должны разделяться точкой с запятой. А в итоге положительный_формат будет использоваться для форматирования не только положительных, но и отрицательных значений. В приведенном ниже примере программы демонстрируется лишь несколько специальных форматов, которые могут быть определены пользователем. // Пример применения специальных форматов, using System; class PictureFormatDemo { static void Main() { double num = 64354.2345; Console.WriteLine("Формат по умолчанию: " + num); // Отобразить числовое значение с 2 разрядами после десятичной точки. Console.WriteLine("Значение с 2 десятичными разрядами: " + "{0:#.##}", num); // Отобразить числовое значение с 2 разрядами после // десятичной точки и запятыми перед ней. Console.WriteLine("Добавить запятые: {0:#,###.##}", num); // Отобразить числовое значение в экспоненциальном представлении. Console.WriteLine("Использовать экспоненциальное представление: " + "{0:#.###е+00}", num); // Отобразить числовое значение, масштабированное в тысячах. Console.WriteLine("Значение в тысячах: " + "{0:#0,}", num) ; /* Отобразить по‑разному положительные, отрицательные и нулевые значения. */ Console.WriteLine("Отобразить по‑разному положительные," + "отрицательные и нулевые значения."); Console.WriteLine("{0:#.#; (#.##);0.00}", num); num = ‑num; Console.WriteLine("{0:#.##;(#.##);0.00}", num); num = 0.0; Console.WriteLine ("{0:#.##; (#.##);0.00} ", num) ; // Отобразить числовое значение в процентах, num = 0.17; Console.WriteLine("Отобразить в процентах: {0:#%}", num); } } Ниже приведен результат выполнения этой программы. Формат по умолчанию: 64354.2345 Значение с 2 десятичными разрядами: 64354.23 Добавить запятые: 64,354.23 Использовать экспоненциальное представление: 6.435е+04 Значение в тысячах: 64 Отобразить по‑разному положительные, отрицательные и нулевые значения. 64354.2 (64354.23) 0.00 Отобразить в процентах: 17% Форматирование даты и времени Помимо числовых значений, форматированию нередко подлежит и другой тип данных: DateTime. Это структура, представляющая дату и время. Значения даты и времени могут отображаться самыми разными способами. Ниже приведены лишь некоторые примеры их отображения. 06/05/2005 Friday, January 1, 2010 12:59:00 12:59:00 PM Кроме того, дата и время могут быть по‑разному представлены в отдельных странах. Для этой цели в среде .NET Framework предусмотрена обширная подсистема форматирования значений даты и времени. Форматирование даты и времени осуществляется с помощью спецификаторов формата. Спецификаторы формата даты и времени сведены в табл. 22.7. Конкретное представление даты и времени может отличаться в силу региональных и языковых особенностей и поэтому зависит от настройки параметров культурной среды. Таблица 22.7. Спецификаторы формата даты и времени Спецификатор Формат D Дата в длинной форме d Дата в краткой форме F Дата и время в длинной форме f Дата и время в краткой форме G Дата – в краткой форме, время – в длинной gg Дата и время – в краткой форме м Месяц и день m То же, что и м 0 Формат даты и времени, включая часовой пояс. Строка, составленная в формате 0, может быть преобразована обратно в эквивалентную форму вывода даты и времени. Это так называемый “круговой” формат о То же, что и о R Дата и время в стандартной форме по Гринвичу г То же, что и R s Сортируемый формат представления даты и времени T Время в длинной форме t Время в краткой форме Окончание табл. 22.7 Спецификатор Формат и Длинная форма универсального представления даты и времени; время ото бражается как универсальное синхронизированное время (UTC) и Краткая форма универсального представления даты и времени Y Месяц и год У То же, что и Y В приведенном ниже примере программы демонстрируется применение спецификаторов формата даты и времени. // Отформатировать дату и время, используя стандартные форматы, using System; class TimeAndDateFormatDemo { static void Main() { DateTime dt = DateTime.Now; // получить текущее время Console.WriteLine("Формат d: {0:d}", dt); Console.WriteLine("Формат D: {0:D}", dt); Console.WriteLine("Формат t: {0:t}", dt) ; Console.WriteLine("Формат'T: {0:T}", dt); Console.WriteLine("Формат f: {0:f}", dt); Console.WriteLine("Формат F: {0:F}", dt); Console.WriteLine("Формат g: {0:g}", dt); Console.WriteLine("Формат G: {0:G}", dt); Console.WriteLine("Формат m: {0:m}", dt); Console.WriteLine("Формат M: {0:M}", dt); Console.WriteLine("Формат о: {0:o}", dt); Console.WriteLine("Формат 0: {0:0}", dt); Console.WriteLine("Формат r: {0:r}", dt); Console.WriteLine("Формат R: {0:R}", dt); Console.WriteLine("Формат s: {0:s}", dt); Console.WriteLine("Формат u: {0:u}", dt); Console.WriteLine("Формат U: {0:U}", dt); Console.WriteLine("Формат у: {0:y}", dt); Console.WriteLine("Y format: {0:Y}", dt) ; } } Эта программа дает следующий результат, который, впрочем, зависит от настроек языковых и региональных параметров локализации базового программного обеспечения. Формат d: 2/11/2010 Формат D: Thursday, February 11, 2010 Формат t: 11:21 AM f Формат T: 11:21:23 AM Формат f: Thursday, February 11, 2010 11:21 AM Формат F: Thursday, February 11, 2010 11:21:23 AM Формат g: 2/11/2010 11:21 AM Формат G: 2/11/2010 11:21:23 AM Формат m: February 11 Формат M: February 11 Формат о: 2010‑02‑11T11:21:23.3768153‑06:00 Формат О: 2010‑02‑11T11:21:23.3768153‑06:00 Формат r: Thu, 11 Feb 2010 11:21:23 GMT Формат R: Thu, 11 Feb 2010 11:21:23 GMT Формат s: 2010‑02‑11T11:21:23 Формат u: 2010‑02‑11 11:21:23Z Формат U: Thursday, February 11, 2010 5:21:23 PM Формат у: February, 2010 Формат Y: February, 2010 В следующем примере программы воспроизводятся очень простые часы. Время обновляется каждую секунду, и каждый час компьютер издает звонок. Для получения отформатированного строкового представления времени перед его выводом в этой программе используется метод ToStringO из структуры DateTime. Через каждый час символ звукового предупреждающего сигнала присоединяется к отформатированной строке, представляющей время, в результате чего звенит звонок. // Пример простых часов. using System; class SimpleClock { static void Main() { string t; int seconds; DateTime dt = DateTime.Now; seconds = dt.Second; for(;;) { dt = DateTime.Now; // обновлять время через каждую секунду if(seconds != dt.Second) { seconds = dt.Second; t = dt.ToString("T"); if(dt.Minute==0 && dt.Second==0) • t = t + "\a"; // производить звонок через каждый час Определение пользовательского формата даты и времени Несмотря на то что стандартные спецификаторы формата даты и времени предусмотрены практически на все случаи жизни, пользователь может определить свои собственные специальные форматы. Процесс определения пользовательских форматов даты и времени мало чем отличается от описанного выше для числовых типов значений. По существу, пользователь создает пример (т.е. изображение) того, как должны выглядеть выводимые данные даты и времени. Для определения пользовательского формата даты и времени служат символы‑заполнители, перечисленные в табл. 22. 8. Таблица 22.8. Символы‑заполнители специального формата даты и времени Символ‑заполнитель Назначение d День месяца в виде числа в пределах от 1 до 31 dd День месяца в виде числа в пределах от 1 до 31. Числовые значения в пределах от 1 до 9 дополняются начальным нулем ddd Сокращенное название дня недели dddd Полное название дня недели f, ff, fff, ffff, Дробная часть числового значения, обозначающего секун fffff, ffffff, fffffff ды. Количество десятичных разрядов определяется числом заданных символов f g Эра h Часы в виде числа в пределах от 1 до 12 hh Часы в виде числа в пределах от 1 до 12. Числовые значения в пределах от 1 до 9 дополняются начальным нулем H Часы в виде числа в пределах от 0 до 23 HH Часы в виде числа в пределах от 0 до 23. Числовые значения в пределах от 1 до 9 дополняются начальным нулем К Часовой пояс, указываемый в часах. Для автоматической коррекции местного времени и универсального синхронизированного времени (UTC) используется значение свойства DateTime. Kind. (Этот спецификатор формата рекомендуется теперь вместо спецификаторов с символами‑заполнителями Z.) m Минуты mm Минуты. Числовые значения в пределах от 1 до 9 дополняются начальным нулем M Месяц в виде числа в пределах от 1 до 12 MM Месяц в виде числа в пределах от 1 до 12. Числовые значения в пределах от 1 до 9 дополняются начальным нулем МММ Сокращенное название месяца MMMM Полное название месяца s Секунды ss Секунды. Числовые значения в пределах от 1 до 9 дополняются начальным нулем t Символ “А” или “Р”, обозначающий время А.М. (до полудня) или P.M. (после полудня) соответственно Символ‑заполнитель Назначение tt A.M. или P.M. У Год в виде двух цифр, если недостаточно одной УУ Год в виде двух цифр. Числовые значения в пределах от 1 до 9 дополняются начальным нулем УУУ Год в виде трех цифр УУУУ Год в виде четырех цифр УУУУУ Год в виде пяти цифр z Смещение часового пояса в часах zz Смещение часового пояса в часах. Числовые значения в пределах от 1 до 9 дополняются начальным нулем zzz Смещение часового пояса в часах и минутах : Разделитель для составляющих значения времени / Разделитель для составляющих значения даты %fmt Стандартный формат, соответствующий спецификатору формата fmt Глядя на табл. 22.8, можно заметить, что символы‑заполнители d, f, g, m, М, s и t выполняют ту же функцию, что и аналогичные символы‑заполнители из табл. 22.7. Вообще говоря, если один из этих символов указывается отдельно, то он интерпретируется как спецификатор формата. В противном случае он считается символом‑заполнителем. Поэтому если требуется указать несколько таких символов отдельно, но интерпретировать их как символы‑заполнители, то перед каждым из них следует поставить знак %. В приведенном ниже примере программы демонстрируется применение нескольких форматов даты и времени. // Отформатировать дату и время, используя специальные форматы, using System; class CustomTimeAndDateFormatsDemo { static void Main() { DateTime dt = DateTime.Now; Console.WriteLine("Время: {0:hh:mm tt}", dt) ; Console.WriteLine("Время в 24‑часовом формате: {0:HH:mm}", dt) ; Console.WriteLine("Дата: {0:ddd МММ dd, yyyy}", dt) ; Console.WriteLine("Эра: {0:gg}", dt) ; Console.WriteLine("Время в секундах: " + "{0:HH:mm:ss tt}", dt) ; Console.WriteLine("День месяца в формате m: {0:m}", dt); Console.WriteLine("Минуты в формате m: {0:%m}", dt); Вот к какому результату приводит выполнение этой программы (опять же все зависит от конкретных настроек языковых и региональных параметров локализации базового программного обеспечения). Время: 11:19 AM Время 24‑часовом формате: 11:19 Дата: Thu Feb 11, 2010 Эра: A.D. Время в секундах: 11:19:40 AM День месяца в формате m: February 11 Минуты в формате ш: 19 Форматирование промежутков времени Начиная с версии 4.0, в среде .NET Framework появилась возможность форматировать объекты типа Time Span – структуры, представляющей промежуток времени. Объект типа Time Span может быть получен самыми разными способами, в том числе и в результате вычитания одного объекта типа DateTime из другого. И хотя форматировать объекты типа Time Span приходится нечасто, о такой возможности все же стоит упомянуть вкратце. По умолчанию в структуре Time Span поддерживаются три стандартных спецификатора формата даты и времени: с, g и G. Они обозначают инвариантную форму промежутка времени, короткую и длинную форму с учетом культурной среды соответственно (последняя форма всегда включает в себя дни). Кроме того, в структуре Time Span поддерживаются специальные спецификаторы формата даты и времени, приведенные в табл. 22.9. Вообще говоря, если один из этих спецификаторов используется в отдельности, его нужно предварить символом %. Таблица 22.9. Символы‑заполнители специального формата промежутка времени Символ‑заполнитель Назначение d, dd, ddd, dddd, Целые дни. Если указано несколько символов‑заполнителей ddddd, dddddd, ddddddd d, то отображается, по крайней мере, указанное количество цифр с начальными нулями, если требуется h, hh Часы (не считая тех, что составляют часть целого дня). Если указано hh, то отображаются две цифры с начальными нулями, если требуется m, mm Минуты (не считая тех, что составляют часть целого часа). Если указано mm, то отображаются две цифры с начальными нулями, если требуется s, ss Секунды (не считая тех, что составляют часть целой минуты). Если указано ss, то отображаются две цифры с начальными нулями, если требуется f, ff, fff, ffff, Дробные доли секунды. Количество символов‑заполнителей fffff, ffffff, fffffff f обозначает точность представления, а остальные цифры отбрасываются F, FF, FFF, FFFF, Дробные доли секунды. Количество символов‑заполнителей FFFFF, FFFFFF, FFFFFFF F обозначает точность представления, а остальные цифры отбрасываются и конечные нули не отображаются В приведенной ниже программе демонстрируется форматирование объектов типа TimeSpan на примере отображения времени, которое приблизительно требуется для вывода на экран 1000 целых значений в цикле for. // Отформатировать объект типа TimeSpan. using System; class TimeSpanDemo { static void Main() { DateTime start = DateTime.Now; // Вывести числа от 1 до 1000. for(int i = 1; i <= 1000; i++) { Console.Write(i + " "); if((i % 10) == 0) Console.WriteLine(); } Console.WriteLine(); DateTime end = DateTime.Now; TimeSpan span = end ‑ start; Console.WriteLine("Время выполнения: {0:c}", span); Console.WriteLine("Время выполнения: {0:g}", span); Console.WriteLine("Время выполнения: {0:G}", span); Console.WriteLine("Время выполнения: 0.{0:fff} секунды", span); } } Выполнение этой программы приводит к следующему результату, который и в этом случае зависит от конкретных настроек языковых и региональных параметров локализации базового программного обеспечения, а также от загрузки системы задачами и ее быстродействия. 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 Время выполнения: 00:00:00.0140000 Время выполнения: 0:00:00.014 Время выполнения: 0:00:00:00.0140000 Время выполнения: 0.014 секунды Форматирование перечислений В C# допускается также форматировать значения, определяемые в перечислении. Вообще говоря, значения из перечисления могут отображаться как по имени, так и по значению. Спецификаторы формата перечислений сведены в табл. ”22.10. Обратите особое внимание на форматы G и F. Перед перечислениями, которые должны представлять битовые поля, следует указывать атрибут Flags. Как правило, в битовых полях хранятся значения, обозначающие отдельные двоичные разряды и упорядоченные по степени числа 2. При наличии атрибута Flags имена всех битовых составляющих форматируемого значения, если, конечно, это действительное значение, отображаются с помощью спецификатора G. А с помощью спецификатора F отображаются имена всех битовых составляющих форматируемого значения, если оно составляется путем логического сложения по ИЛИ двух или более полей, определяемых в перечислении. Таблица 22.10. Спецификаторы формата перечислений Спецификатор Назначение D Отображает значение в виде десятичного целого числа d То же, что и D F Отображает имя значения. Если это значение можно создать путем логиче ского сложения по ИДИ двух или более полей, определенных в перечислении, то данный спецификатор отображает имена всех битовых составляющих заданного значения, причем независимо оттого, задан атрибут Flags или нет f То же, что и F G Отображает имя значения. Если перед форматируемым перечислением ука зывается атрибут Flags, то данный спецификатор отображает имена всех битовых составляющих заданного значения, если, конечно, это допустимое значение g То же, что и G X Отображает значение в виде шестнадцатеричного целого числа. Для отобра жения как минимум восьми цифр форматируемое значение дополняется (при необходимости) начальными нулями х_То же, что и X_ В приведенной ниже программе демонстрируется применение спецификаторов формата перечислений. // Отформатировать перечисление. using System; class EnumFmtDemo { enum Direction { North, South, East, West } [Flags] enum Status { Ready=0xl, OffLine=Ox2, Waiting=0x4, TransmitOK=Ox8, ReceiveOK=OxlO, OnLine=0x20 } static void Main() { Direction d = Direction.West; Console.WriteLine("{0:G}", d); Console.WriteLine("{0:F}", d); 1 Console.WriteLine("{0:D}", d); Console.WriteLine("{0:X}", d) ; Status s = Status.Ready | Status.TransmitOK; Console.WriteLine("{0:G}", s); Console.WriteLine("{0:F}", s); Console.WriteLine("{0:D}", s); Console.WriteLine("{0:X}", s); } } Ниже приведен результат выполнения этой программы. West West 3 00000003 Ready, TransmitOK Ready, TransmitOK 9 |