Другие возможности выводаДо сих пор при выводе с помощью метода WriteLine () данные отображались в формате, используемом по умолчанию. Но в среде .NET Framework определен достаточно развитый механизм форматирования, позволяющий во всех деталях управлять выводом данных. Форматированный ввод-вывод подробнее рассматривается далее в этой книге, а до тех пор полезно ознакомиться с некоторыми возможностями форматирования. Они позволяют указать, в каком именно виде следует выводить значения с помощью метода WriteLine (). Благодаря этому выводимый результат выглядит более привлекательно. Следует, однако, иметь в виду, что механизм форматирования поддерживает намного больше возможностей, а не только те, которые рассматриваются в этом разделе.
При выводе списков данных в предыдущих примерах программ каждый элемент списка приходилось отделять знаком +, как в следующей строке:
- Код: Выделить всё
Console .WriteLine ("Вы заказали " + 2 + " предмета по цене $" + 3 + " каждый.");
Конечно, такой способ вывода числовой информации удобен, но он не позволяет управлять внешним видом выводимой информации. Например, при выводе значения с плавающей точкой нельзя определить количество отображаемых десятичных разрядов. Рассмотрим оператор
- Код: Выделить всё
Console.WriteLine("Деление 10/3 дает: " + 10.0/3.0);
который выводит следующий результат:
- Код: Выделить всё
Деление 10/3 дает: 3.33333333333333
В одних случаях такого вывода может оказаться достаточно, а в других — он просто недопустим. Например, в финансовых расчетах после десятичной точки принято указывать лишь два десятичных разряда.
Для управления форматированием числовых данных служит другая форма метода WriteLine (), позволяющая встраивать информацию форматирования, как показано ниже.
- Код: Выделить всё
WriteLine("форматирующая строка ", arg0, argl, ... , argsN);
В этой форме аргументы метода WriteLine () разделяются запятой, а не знаком +. А форматирующая строка состоит из двух элементов: обычных печатаемых символов, предназначенных для вывода в исходном виде, а также спецификаторов формата. Последние указываются в следующей общей форме:
- Код: Выделить всё
{argnum, width: fmt)
где argnum — номер выводимого аргумента, начиная с нуля; width — минимальная ширина поля; fmt — формат. Параметры width и fmt являются необязательными.
Если во время выполнения в форматирующей строке встречается спецификатор формата, то вместо него подставляется и отображается соответствующий аргумент, обозначаемый параметром argnum. Таким образом, местоположение спецификатора формата в форматирующей строке определяет место отображения соответствующих данных. Параметры width и fmt указывать необязательно. Это означает, что в своей простейшей форме спецификатор формата обозначает конкретный отображаемый аргумент. Например, спецификатор {0} обозначает аргумент arg0, спецификатор {1} — аргумент arg1 и т.д.
Начнем с самого простого примера. При выполнение оператора
- Код: Выделить всё
Console.WriteLine ("В феврале {0} или {1} дней.", 28, 29);
получается следующий результат:
- Код: Выделить всё
В феврале 28 или 29 дней
Как видите, значение 28 подставляется вместо спецификатора {0}, а значение 29 — вместо спецификатора {1}. Следовательно, спецификаторы формата обозначают место в строке, где отображаются соответствующие аргументы (в данном случае — значения 28 и 29). Кроме того, обратите внимание на то, что дополнительные значения разделяются запятой, а не знаком +.
Ниже приведен видоизмененный вариант предыдущего оператора, в котором указывается ширина полей.
- Код: Выделить всё
Console.WriteLine ("В феврале (0,10} или (1,5} дней.", 28, 29);
Выполнение этого оператора дает следующий результат:
- Код: Выделить всё
В феврале 28 или 29 дней.
Как видите, неиспользуемые части полей заполнены пробелами. Напомним, что минимальная ширина поля определяется параметром width. Если требуется, она может быть превышена при выводе результата.
Разумеется, аргументы, связанные с командой форматирования, не обязательно должны быть константами. Ниже приведен пример программы, которая выводит таблицу результатов возведения чисел в квадрат и куб. В ней команды форматирования используются для вывода соответствующих значений.
- Код: Выделить всё
using System;
class DisplayOptions
{
static void Main()
{
int i;
Console.WriteLine("Число\tКвадрат\tКуб");
for (i = 1; i < 10; i++) Console.WriteLine("{0}\t{1}\t{2}", i, i * i, i * i * i);
}
}
}
Результат выполнения этой программы выглядит следующим образом:

В приведенных выше примерах сами выводимые значения не форматировались. Но ведь основное назначение спецификаторов формата — управлять внешним видом выводимых данных. Чаще всего форматированию подлежат следующие типы данных: с плавающей точкой и десятичный. Самый простой способ указать формат данных — описать шаблон, который будет использоваться в методе WriteLine (). Для этого указывается образец требуемого формата с помощью символов #, обозначающих разряды чисел. Кроме того, можно указать десятичную точку и запятые, разделяющие цифры. Ниже приведен пример более подходящего вывода результата деления 10 на 3.
- Код: Выделить всё
Console.WriteLine("Деление 10/3 дает: {0:#.##}", 10.0/3.0);
Выполнение этого оператора приводит к следующему результату:
- Код: Выделить всё
Деление 10/3 дает: 3.33
В данном примере шаблон #.## указывает методу WriteLineO отобразить два десятичных разряда в дробной части числа. Следует, однако, иметь в виду, что метод WriteLine () может отобразить столько цифр слева от десятичной точки, сколько потребуется для правильной интерпретации выводимого значения.
Рассмотрим еще один пример. Оператор
- Код: Выделить всё
Console.WriteLine("{0:###,###.##}", 123456.56);
дает следующий результат:
- Код: Выделить всё
123,456.56
Для вывода денежных сумм рекомендуется использовать спецификатор формата С.
Например:
- Код: Выделить всё
decimal balance;
balance = 12323.09m;
Console.WriteLine("Текущий баланс равен (0:C}", balance);
Результат выполнения этого фрагмента кода выводится в формате денежных сумм, указываемых в долларах США.
- Код: Выделить всё
Текущий баланс равен $12,323.09
Форматом С можно также воспользоваться для того, чтобы представить в более подходящем виде результат выполнения рассматривавшейся ранее программы расчета цены со скидкой.
- Код: Выделить всё
using System;
class UseDecimal
{
static void Main()
{
decimal price;
decimal discount;
decimal discounted_price;
price = 19.95m;
discount = 0.15m; discounted_price = price - (price * discount);
Console.WriteLine("Цена со скидкой: {0:C}", discounted_price);
}
}
Вот как теперь выглядит результат выполнения этой программы:
