Форматирующие строки

86

Если вы хотите, чтобы разрабатываемые классы были дружественными к пользователю, они должны предлагать средства для отображения своих строковых представлений в любом из форматов, которые могут понадобиться пользователю. В исполняющей среде .NET определен стандартный способ достижения этого — интерфейс IFormattable. Описание способа добавления этого важного свойства к пользовательским классам и структурам и представляет собой тему настоящей статьи.

Начнем с рассмотрения того, что происходит, когда форматная строка применяется к примитивному типу, а отсюда станет ясно, как следует включать спецификаторы формата для пользовательских классов и структур:

decimal d = 12.05667m;
int i = 5;

Console.WriteLine("Значение переменной d = {0:C}, а i = {1}",d,i);

Сама строка формата содержит большую часть отображаемого текста, но всякий раз, когда в нее должно быть вставлено значение переменной, в фигурных скобках указывается индекс. В фигурные скобки может быть включена и другая информация, относящаяся к формату данного элемента, например, та, что описана ниже:

В следующей таблице перечислены часто используемые спецификаторы формата для числовых типов:

Спецификаторы формата для чисел
Спецификатор Применяется к Значение Пример
C Числовым типам Символ местной валюты $835.50 (США)
£835.50 (Великобритания) 835.50р.(Россия)
D Только к целочисленным типам Обычное целое 835
E Числовым типам Экспоненциальная нотация 8.35Е+002
F Числовым типам С фиксированной десятичной точкой 835.50
G Числовым типам Обычные числа 835.5
N Числовым типам Формат чисел, принятый в данной местности 4,384.50 (Великобритания/США)
4 384,50 (континентальная Европа)
P Числовым типам Процентная нотация 835,000.00%
X Только к целочисленным типам Шестнадцатеричный формат 1a1f

Стоит отметить, что полный список спецификаторов формата значительно длинее, поскольку другие типы данных добавляют собственные спецификаторы.

Форматирование даты и времени

Помимо числовых значений, форматированию нередко подлежит и другой тип данных: DateTime. Это структура, представляющая дату и время. Значения даты и времени могут отображаться самыми разными способами.

Форматирование даты и времени осуществляется с помощью спецификаторов формата. Конкретное представление даты и времени может отличаться в силу региональных и языковых особенностей и поэтому зависит от настройки параметров культурной среды. Спецификаторы формата даты и времени сведены в следующей таблице:

Спецификаторы формата для дат
Спецификатор Формат
D Дата в длинной форме
d Дата в краткой форме
F Дата и время в длинной форме
f Дата и время в краткой форме
G Дата — в краткой форме, время — в длинной
g Дата и время — в краткой форме
М Месяц и день
m То же, что и М
O Формат даты и времени, включая часовой пояс. Строка, составленная в формате О, может быть преобразована обратно в эквивалентную форму вывода даты и времени. Это так называемый "круговой" формат
R Дата и время в стандартной форме по Гринвичу
s Сортируемый формат представления даты и времени
T Время в длинной форме
t Время в краткой форме
U Длинная форма универсального представления даты и времени; время отображается как универсальное синхронизированное время (UTC)
u Краткая форма универсального представления даты и времени
Y Месяц и год

В приведенном ниже примере программы демонстрируется применение спецификаторов формата даты и времени:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime myDate = DateTime.Now;
            Console.WriteLine("Дата в формате d: {0:d}\nВ формате D: {0:D}",myDate);
            Console.WriteLine("Дата в формате f: {0:f}\nВ формате F: {0:F}", myDate);
            Console.WriteLine("Дата в формате g: {0:g}\nВ формате G: {0:G}", myDate);
            Console.WriteLine("Дата в формате m: {0:m}\nВ формате M: {0:M}", myDate);
            Console.WriteLine("Дата в формате r: {0:r}\nВ формате R: {0:R}", myDate);
            Console.WriteLine("Дата в формате o: {0:o}\nВ формате O: {0:O}", myDate);
            Console.WriteLine("Дата в формате s: {0:s}", myDate);
            Console.WriteLine("Дата в формате t: {0:t}\nВ формате T: {0:T}", myDate);
            Console.WriteLine("Дата в формате u: {0:u}\nВ формате U: {0:U}", myDate);
            Console.WriteLine("Дата в формате y: {0:y}\nВ формате Y: {0:Y}", myDate);

            Console.ReadLine();
        }
    }
}
Разный формат даты и времени в C#
Лучший чат для C# программистов