В приведенной ниже программе демонстрируется применение нескольких спецификаторов формата числовых данных.

// Продемонстрировать применение различных // спецификаторов формата числовых данных.

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 %

$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