
Объектно-ориентированное программирование.-6
.pdf
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 |
|