Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Объектно-ориентированное программирование.-6

.pdf
Скачиваний:
8
Добавлен:
05.02.2023
Размер:
4.5 Mб
Скачать

3) «.» – десятичный разделитель. Пример:

value = 1.2; Console.WriteLine(value.ToString("0.00")); Console.WriteLine(value.ToString("00.00")); Console.WriteLine(value.ToString("00.00", us)); value = .086; Console.WriteLine(value.ToString("#0.##%")); value = 86000; Console.WriteLine(value.ToString("0.###E+0"));

Вывод на консоль:

1,20

01,20

01.20

8,6%

8,6E+4

4) «,» – разделитель групп разрядов. Пример:

value = 1234567890; Console.WriteLine(value.ToString("#,#")); Console.WriteLine(value.ToString("#,##0,,")); Console.WriteLine(value.ToString("#,,")); Console.WriteLine(value.ToString("#,,,"));

Вывод на консоль:

1 234 567 890

1 235

1235

1

5) «%» – заместитель процентов. Пример:

value = .086; Console.WriteLine(value.ToString("#0.##%"));

Вывод на консоль:

8,6%

6) «‰» – заместитель промилле. Пример:

value = .00354;

Console.WriteLine(value.ToString("#0.##‰"));

Вывод на консоль:

3.54‰

Примечание. Для вывода этого символа на консоль должна использоваться кодировка Unicode.

7) «E|e[+|–]0» – экспоненциальное представление чисел. Пример:

value = 86000; Console.WriteLine(value.ToString("0.###E+0"));

151

Console.WriteLine(value.ToString("0.###E+000"));

Console.WriteLine(value.ToString("0.###E–000"));

Вывод на консоль:

8,6E+4

8,6E+004

86000,000E-000

8) «;» – разделитель секций. Если указаны две секции, то первая – для положительных чисел и нуля, вторая – для отрицательных чисел. Если три секции – первая для положительных чисел, вторая для отрицательных чисел, третья – для нуля. Пример:

value = 1234; Console.WriteLine(value.ToString("##;(##)")); value = -1234; Console.WriteLine(value.ToString("##;(##)")); value = 0;

Console.WriteLine(value.ToString("##;(##);ноль!"));

Вывод на консоль:

1234

(1234)

ноль!

Шаблоны для даты и времени

1)«d» – день месяца (1-31);

2)«dd» – день месяца (01-31);

3)«M» – месяц (1-12);

4)«MM» – месяц (01-12).

Пример:

Console.WriteLine(v16.ToString("d.M", ru));

Console.WriteLine(v16.ToString("dd.MM", ru));

Вывод на консоль:

20.8

20.08

5)«ddd» – сокращенное название дня недели (согласно элементам мас-

сива DateTimeFormatInfo.AbbreviatedDayNames);

6)«dddd…» – полное название дня недели (согласно элементам масси-

ва DateTimeFormatInfo.DayNames);

7)«MMM» – сокращенное название месяца (согласно элементам мас-

сива DateTimeFormatInfo.AbbreviatedMonthNames);

152

8) «MMMM…» – полное название месяца (согласно элементам массива

DateTimeFormatInfo.MonthNames).

Пример:

Console.WriteLine(v16.ToString("ddd d MMM", us));

Console.WriteLine(v16.ToString("ddd d MMM",

CultureInfo.CreateSpecificCulture("fr-FR")));

Console.WriteLine(v16.ToString("d MMMM",

CultureInfo.CreateSpecificCulture("es-MX")));

Console.WriteLine(v16.ToString("dddd dd MMMM",

CultureInfo.CreateSpecificCulture("it-IT")));

Console.WriteLine(v16.ToString("dddd dd MMMM", ru));

Вывод на консоль:

Fri 20 Aug ven. 20 aout 20 agosto

venerdi 20 agosto

пятница 20 августа

9)«y» – год (0-99);

10)«yy» – год (00-99);

11)«yyy» – год (000-…);

12)«yyyy» – год (0000-9999);

13)«yyyyy…» – год (00000-99999);

14)«g…» – эра.

Пример:

Console.WriteLine(v16.ToString("MM/dd/yyy g", us));

Console.WriteLine(v16.ToString("MM/dd/yyyy g",

CultureInfo.CreateSpecificCulture("fr-FR")));

Вывод на консоль:

08/20/2010 A.D. 08/20/2010 ap. J.-C.

15)«f», «ff», «fff», «ffff», «fffff», «ffffff», «fffffff» – доли секунды;

16)«F», «FF», «FFF», «FFFF», «FFFFF», «FFFFFF», «FFFFFFF» – доли секунды (незначащие нули не отображаются);

17)«s» – секунды (0-59);

18)«ss…» – секунды (00-59);

19)«m» – минуты (0-59);

20)«mm…» – минуты (00-59);

21)«h» – часы (1-12);

22)«hh…» – часы (01-12);

23)«H» – часы (0-23);

153

24) «HH…» – часы (00-23);

Пример:

Console.WriteLine(v16.ToString("hh:m:ss.f"));

Console.WriteLine(v16.ToString("hh:m:ss.F"));

Console.WriteLine(v16.ToString("H:mm:s.ff"));

Console.WriteLine(v16.ToString("H:mm:s.FF"));

Console.WriteLine(v16.ToString("HH:mm:ss.fff"));

Console.WriteLine(v16.ToString("HH:mm:ss.FFF"));

Console.WriteLine(v16.ToString("h:mm:ss.ffff"));

Console.WriteLine(v16.ToString("h:mm:ss.FFFF"));

Вывод на консоль:

06:30:00.0

06:30:00

18:30:0.05

18:30:0.05

18:30:00.055

18:30:00.055

6:30:00.0550

6:30:00.055

25)«t» – первый знак AM/PM (в соответствии со значениями string

DateTimeFormatInfo.AMDesignator, string DateTimeFormatInfo.PMDesignator);

26)«tt…» – полная строка AM/PM;

27)«z», «zz», «zzz…» – смещение часового пояса.

Пример:

Console.WriteLine(v16.ToString("hh:mm t", us)); Console.WriteLine(v16.ToString("hh:mm tt zzz", us)); ru.DateTimeFormat.PMDesignator = "вечера";

Console.WriteLine(v16.ToString("hh:mm tt", ru));

Вывод на консоль:

06:30 P

06:30

PM +07:00

06:30

вечера

28)«:» – разделитель времени (в соответствии со значением string

DateTimeFormatInfo.TimeSeparator);

29)«/» – разделитель даты (в соответствии со значением string

DateTimeFormatInfo.DateSeparator).

Пример:

Console.WriteLine(v16.ToString("dd/MM/yyyy", ru));

Console.WriteLine(v16.ToString("dd'/'MM'/'yyyy", ru));

Console.WriteLine(v16.ToString("dd\"/\"MM\"/\"yyyy", ru));

Console.WriteLine(v16.ToString("\tt", us));

Вывод на консоль:

154

20.08.2010

20/08/2010

20/08/2010 P

Впервой дате в качестве разделителя использовался разделитель даты,

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

Можно заметить, что некоторые шаблоны даты и времени совпадают с форматами. Например, формат «t» выводит короткое время, а шаблон «t» – первый знак AM/PM. Как компилятор их различает? Если в строке, кроме символа «t», других символов нет – это формат, если есть – шаблон.

3.2.1.5. Метод Format

Метод Format отличается от ToString тем, что позволяет форматировать сразу несколько объектов. Для этого в строку формата вводится новая конструкция:

"{"<номер аргумента>[,<ширина поля>][:<формат>]"}"

Здесь:

Номер аргумента – номер форматируемого аргумента (нумерация начинается с нуля).

Ширина поля – количество символов, которое отводится для строкового представления объекта. Если ширина положительная, используется выравнивание вправо, если отрицательная – влево.

Формат – один из рассмотренных выше форматов (если формат не указан, используется формат по умолчанию).

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

Чтобы символы фигурных скобок в формате считались обычными символами, а не началом форматируемого поля, их нужно ставить парами.

155

Данный метод также позволяет осуществлять форматирование объектов типа bool, char и string. На них указанный формат не оказывает влияния.

Метод String.Format имеет два основных варианта синтаксиса:

static string String.Format(string format, object obj0, ...);

static string String.Format(IFormatProvider provider, string format, object obj0, ...);

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

Также в классе System.Enum есть метод Enum.Format. Он позволяет форматировать объекты перечисляемого типа. Можно использовать те же форматы, что и при форматировании перечислений методом ToString. Синтаксис метода:

static string Enum.Format(Type enumType, object value, string format);

Пример:

Console.WriteLine(String.Format("{0:t} {0:d}", v16)); Console.WriteLine(String.Format("float: {0:e}, {0:f}, {0:g}\ndouble:

{1:e}, {1:f}, {1:g}", v9, v10)); Console.WriteLine(String.Format("{0:dd/MM/yyyy}", v16)); Console.WriteLine(String.Format(us, "{0:0.###E+0}", v9)); Console.WriteLine(String.Format("{0,-10:g}!!!", v2)); Console.WriteLine(String.Format("{0,10:g}!!!", v1)); Console.WriteLine(String.Format("bool: {0,-10}!!!", v12)); Console.WriteLine(String.Format("bool: {0,10}!!!", v12)); Console.WriteLine(String.Format("char: {0,-10}!!!", v13)); Console.WriteLine(String.Format("char: {0,10}!!!", v13)); Console.WriteLine(String.Format("string: {0,-10}!!!", v14)); Console.WriteLine(String.Format("string: {0,10}!!!", v14)); Console.WriteLine(Enum.Format(v15.GetType(), v15, "g")); Console.WriteLine(Enum.Format(typeof(DayOfWeek), v15, "g"));

Console.WriteLine(String.Format("{{а это не формат}}"));

Вывод на консоль:

18:30 20.08.2010

float: 2,478000e-001, 0,25, 0,2478

double: 1,234568e+008, 123456789,12, 123456789,123457 20.08.2010

2.478E-1

 

 

-111

!!!

178!!!

bool: True

 

!!!

bool:

 

True!!!

char: A

 

!!!

char:

 

A!!!

string: ABC

!!!

string:

 

ABC!!!

Friday

 

 

Friday

 

 

156

{а это не формат}

Как видно, в методе Format применимы все виды форматирования, доступные для методов ToString.

3.2.2. Вывод на консоль

Для вывода на консоль предназначены методы класса System.Console – Console.Write и Console.WriteLine. В классе Console есть и другие методы для управления выводом – копирования областей текста, изменения цвета текста и фона, управления курсором, смены кодировки и т.д. Все они для удобства пользователя являются статическими, т.е. чтобы не требовалось создавать экземпляры класса Console. Мы их рассматривать не будем, а полный список есть в библиотеке MSDN.

Синтаксис метода Write похож на синтаксис метода Format:

static void Write(string format, object obj0, ...);

Есть и другие реализации этого метода, но все они работают одинаково. Если формат объекта не указан (в этом случае объект в списке аргументов может быть только один), например, Write(i), где i – целая переменная, то применяется формат по умолчанию. Т.е. эквивалентом такого вызова будет

Write(i.ToString()) или Write("{0}", i).

Метод Write использует для форматирования метод String.Format, поэтому их возможности форматирования совпадают. Вся разница в том, что метод Write выводит отформатированную строку на консоль, а метод Format возвращает ее в качестве результата.

Поэтому результат работы следующего кода будет почти аналогичен результату работы кода для метода Format:

Console.WriteLine("{0:t} {0:d}", v16);

Console.WriteLine("float: {0:e}, {0:f}, {0:g}\ndouble: {1:e}, {1:f}, {1:g}", v9, v10);

Console.WriteLine("{0:dd/MM/yyyy}", v16); Console.WriteLine("{0:0.###E+0}", v9); Console.WriteLine("{0,-10:g}!!!", v2); Console.WriteLine("{0,10:g}!!!", v1); Console.WriteLine("bool: {0,-10}!!!", v12); Console.WriteLine("bool: {0,10}!!!", v12); Console.WriteLine("char: {0,-10}!!!", v13); Console.WriteLine("char: {0,10}!!!", v13); Console.WriteLine("string: {0,-10}!!!", v14); Console.WriteLine("string: {0,10}!!!", v14); Console.WriteLine(v15); Console.WriteLine(v15); Console.WriteLine("{{а это не формат}}");

157

Результат работы:

18:30 20.08.2010

float: 2,478000e-001, 0,25, 0,2478

double: 1,234568e+008, 123456789,12, 123456789,123457

20.08.2010

 

 

2,478E-1

 

 

-111

!!!

178!!!

bool: True

 

!!!

bool:

 

True!!!

char: A

 

!!!

char:

 

A!!!

string: ABC

!!!

string:

 

ABC!!!

Friday

Friday

{{а это не формат}}

Есть только два отличия:

1)Число «2,478E-1» при помощи метода Format выводилось в виде «2.478E-1», т.к. мы имели возможность указать реализацию интерфейса IFormatProvider, а для метода Write ее указать нельзя;

2)В последней строке парные скобки ставить не нужно, т.к. списка ар- гументов-объектов у функции Write нет, и строку «{а это не формат}» она воспринимает просто как строку. Если бы объекты были указаны, то скобки следовало бы сделать парными. Пример:

Console.WriteLine("{а это не формат}");

Console.WriteLine("{{а это не формат}}", v1);

Console.WriteLine("{а это не формат}", v1);

Результат работы:

{а это не формат} {а это не формат}

Третья строка не выводится, а генерирует исключительную ситуацию System.FormatException, т.к. ожидается формат для переменной v1, но он указан неверно.

Метод WriteLine отличается от Write только тем, что выводит символ перевода строки в конце. Метод WriteLine без параметров просто переводит позицию вывода на следующую строку.

Пример: Samples\3.2\3_2_2_write.

Напоследок упомянем об еще одном методе класса Console:

static void Clear();

Он удаляет из буфера консоли и ее окна отображаемую информацию

158

(аналог процедуры clrscr в языке C++ или консольной команды cls).

3.2.3. Методы Parse и TryParse

Все типы данных по значению (кроме структур) имеют методы Parse и TryParse, позволяющие преобразовать строку в значение данного типа. Т.е. это операция, обратная форматированию. В структуре DateTime определены четыре метода – Parse, TryParse, ParseExact и TryParseExact.

Разница между методами Parse и TryParse состоит в том, что первый из них возвращает в качестве результата считанное из строки значение, а если преобразование вызывает ошибку, генерирует исключительную ситуацию. Второй метод считанное из строки значение возвращает в виде выходного параметра (см. § 4.4), а возвращает признак успешного завершения разбора. Если разбор успешен, возвращается значение true, иначе false. Исключительные ситуации при этом не генерируются.

Пример: Samples\3.2\3_2_3_parse.

3.2.3.1. Разбор строк с числовыми значениями

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

static <тип> Parse(string s);

static <тип> Parse(string s, NumberStyles style); static <тип> Parse(string s, IFormatProvider provider);

static <тип> Parse(string s, NumberStyles style, IFormatProvider provider);

static bool TryParse(string s, out <тип> result);

static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out <тип> result);

Здесь <тип> – один из типов byte, sbyte, short, ushort, int, uint, long, ulong, float, double и decimal. Ключевое слово out означает выходной параметр (см. § 4.4). Это аналог передачи параметра по ссылке в языке C++. Все методы являются статическими.

По аналогии с методами ToString, можно заключить, что наиболее универсальным является четвертый вариант метода Parse и второй вариант метода TryParse. Все остальные являются их упрощением – в них отсутствует либо ссылка на реализацию интерфейса IFormatProvider, либо стиль NumberStyles, либо и то, и другое.

Перечисление NumberStyles позволяет задать некоторые дополнитель-

159

ные опции преобразования (табл. 3.14).

 

Табл. 3.14 – Константы перечисления NumberStyles

 

 

 

Константа

Описание

 

 

 

 

None (0x0000)

Не разрешен ни один стиль

 

 

 

AllowLeadingWhite

Начальные пробелы не следует обрабатывать в про-

(0x0001)

цессе разбора. Допустимые знаки пробела имеют

 

 

следующие значения в кодировке Unicode: U+0009,

 

U+000A, U+000B, U+000C, U+000D и U+0020

 

 

AllowTrailingWhite

Конечные пробелы не следует обрабатывать в про-

(0x0002)

цессе разбора

 

 

 

 

 

AllowLeadingSign

Числовая строка может включать начальный знак

(0x0004)

(PositiveSign и NegativeSign класса NumberFormat-

 

 

Info)

 

 

 

AllowTrailingSign

Числовая строка может включать конечный знак

(0x0008)

 

 

 

 

AllowParentheses

В числовой строке может находиться одна пара ско-

(0x0010)

бок, в которых заключено число

 

 

 

 

 

AllowDecimalPoint

Числовая строка может включать десятичный разде-

(0x0020)

литель (см. свойства NumberDecimalSeparator,

 

 

CurrencyDecimalSeparator и PercentDecimalSeparator

 

класса NumberFormatInfo)

 

 

 

AllowThousands

В числовой строке могут находиться разделители

(0x0040)

групп (NumberGroupSeparator,

NumberGroupSizes,

 

 

CurrencyGroupSeparator и CurrencyGroupSizes класса

 

NumberFormatInfo)

 

 

 

AllowExponent

Числовая строка может быть в экспоненциальном

(0x0080)

представлении

 

 

 

 

 

AllowCurrencySymbol

Числовая строка разбирается как денежная единица,

(0x0100)

если она содержит символ денежной единицы

 

 

(CurrencySymbol класса NumberFormatInfo)

 

 

 

AllowHexSpecifier

Числовая строка представляет

шестнадцатеричное

(0x0200)

значение

 

 

 

 

 

Integer (0x0007)

Используется комбинация стилей AllowLeading-

 

White, AllowTrailingWhite и AllowLeadingSign

 

 

HexNumber (0x0203)

Используется комбинация стилей AllowLeading-

 

 

 

 

160