Полное руководство. С# 4.0 - Шилдт Герберт
Форматирование осуществляется с помощью двух компонентов: спецификаторов формата и поставщиков формата. Конкретная форма строкового представленияотдельного значения зависит от спецификатора формата. Следовательно, спецификатор формата определяет, в какой именно удобочитаемой форме будут представленыданные. Например, для вывода числового значения в экспоненциальном представлении (т.е. в виде мантиссы и порядка числа) используется спецификатор формата Е.
Как правило, конкретный формат значения зависит от культурных и языковыхособенностей локализации программного обеспечения. Например, в СоединенныхШтатах Америки денежные суммы указываются в долларах, а в странах ЕС — в евро.Для учета культурных и языковых отличий в C# предусмотрены поставщики формата. В частности, поставщик формата определяет порядок интерпретации спецификатора формата. Поставщик формата создается путем реализации интерфейсаIFormatProvider, в котором определяется метод GetFormat(). Для всех встроенныхчисловых типов и многих других типов данных в среде .NET Framework предопределены соответствующие поставщики формата. Вообще говоря, данные можно отформатировать, не указывая конкретный поставщик формата, поэтому поставщики форматане рассматриваются далее в этой книге.
Для того чтобы отформатировать данные, достаточно включить спецификаторформата в метод, поддерживающий форматирование. О применении спецификаторов формата речь уже шла в главе 3, тем не менее к этому вопросу стоит вернутьсявновь. Применение спецификаторов формата рассматривается далее на примере метода Console.WriteLine(), хотя аналогичный подход применим и к другим методам, поддерживающим форматирование.
Для форматирования выводимых данных служит следующая форма методаWriteLine().WriteLine("форматирующая строка", arg0, arg1, ... , argN);
В этой форме аргументы метода WriteLine() разделяются запятой, а не знаком +.А форматирующая строка состоит из двух следующих элементов: обычных печатаемых символов, отображаемых в исходном виде, а также команд форматирования.
Ниже приведена общая форма команд форматирования:{argnum, width: fmt}
где argnum — это номер отображаемого аргумента, начиная с нуля; width — минимальная ширина поля, a fmt — спецификатор формата. Параметры width и fmt неявляются обязательными. Поэтому в своей простейшей форме команда форматирования просто указывает конкретные аргументы для отображения. Например, команда{0} указывает аргумент arg0, команда {1} — аргумент arg1 и т.д.
Если во время выполнения программы в форматирующей строке встречаетсякоманда форматирования, то вместо нее подставляется и затем отображается соответствующий аргумент, определяемый параметром argnum. Следовательно, от положения спецификатора формата в форматирующей строке зависит, где именно будутотображаться соответствующие данные. А номер аргумента определяет конкретныйформатируемый аргумент.
Если в команде форматирования указывается параметр fmt, то данные отображаются в указываемом формате. В противном случае используется формат, выбираемый поумолчанию. Если же в команде форматирования указывается параметр width, то выводимые данные дополняются пробелами для достижения минимально необходимойширины поля. При положительном значении параметра width выводимые данные выравниваются по правому краю, а при отрицательном значении — по левому краю.
Оставшаяся часть данной главы посвящена вопросам форматирования и отдельным спецификаторам формата.Спецификаторы формата числовых данных
Для числовых данных определено несколько спецификаторов формата, сведенныхв табл. 22.4. Каждый спецификатор формата может включать в себя дополнительный,но необязательный спецификатор точности. Так, если числовое значение требуетсяуказать в формате с фиксированной точкой и двумя десятичными разрядами в дробной части, то для этой цели служит спецификатор F2.
Таблица 22.4. Спецификаторы формата числовых данныхСпецификаторФорматНазначение спецификатора точностиСДенежная единицаЗадает количество десятичных разрядовсТо же, что и СDЦелочисленный (используется только с целыми числами)Задает минимальное количество цифр. При необходимости результат дополняется начальными нулямиdТо же, что и DЕЭкспоненциальное представление чисел (в обозначении используется прописная буква Е)Задает количество десятичных разрядов. По умолчанию используется шесть разрядовеЭкспоненциальное представление чисел (в обозначении используется строчная буква е)Задает количество десятичных разрядов. По умолчанию используется шесть разрядовFПредставление чисел с фиксированной точкойЗадает количество десятичных разрядовfТо же, что и FGИспользуется более короткий из двух форматов: Е или FСм. спецификаторы Е и FgИспользуется более короткий из двух форматов: е или fСм. спецификаторы е и fNПредставление чисел с фиксированной точкой (и запятой в качестве разделителя групп разрядов)Задает количество десятичных разрядовnТо же, что и NРПроцентыЗадает количество десятичных разрядовРТо же, что и РR или rЧисловое значение, которое преобразуется с помощью метода Parse() в эквивалентную внутреннюю форму. (Это так называемый "круговой" формат)Не используется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.6617.688.658491.768866е+00417688.6584915.00 %15000000000021$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е+0013 1 2
В первом операторе вызова метода WriteLine() один и тот же аргумент 10.12345форматируется тремя разными способами. Это вполне допустимо, поскольку каждыйспецификатор формата в этом вызове обозначает первый и единственный аргумент.А во втором вызове метода WriteLine() три аргумента отображаются не по порядку.Не следует забывать, что каких-то особых правил, предписывающих обозначать аргументы в спецификаторах формата в определенной последовательности, не существует.Любой спецификатор формата может обозначать какой угодно аргумент.Применение методов String.Format() и ToString() для форматирования данных