Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 1351
Скачиваний: 3
Console.WriteLine(“The sum of {0} and {1} is {0}”,314,3.14,314+3.14); Console.WriteLine(“The sum of {2} and {1} is {0}”,314,3.14,314+3.14);
также отработают вполне корректно.
Консольный вывод. Форматирование
Помимо индекса параметра маркер выводимого значения может содержать дополнительную информацию относительно формата представления выводимой информации. Выводимые значения преобразуются к символьному представлению, которое, в свою очередь, при выводе в окно приложения может быть дополнительно преобразовано в соответствии с предопределённым “сценарием преобразования”. Вся необходимая для дополнительного форматирования информация размещается непосредственно в маркерах и отделяется запятой от индекса маркера.
Таким образом, в операторах вывода можно определить область позиционирования выводимого значения. Например, результатом выполнения следующего оператора вывода:
Console.WriteLine(«***{0,10}***,3.14);
будет следующая строка:
***3.14 ***
А выполнение такого оператора:
Console.WriteLine(«***{0,-10}***,3.14);
приведёт к следующему результату:
*** 3.14***
Кроме того, в маркерах вывода могут также размещаться дополнительные строки форматирования (FormatString). При этом маркер приобретает достаточно сложную структуру, внешний вид которой в общем случае можно представить следующим образом (M – значение индекса, N - область позиционирования):
{M,N:FormatString}
, либо
{M:FormatString}
, если не указывается значение области позиционирования.
Сама же строка форматирования аналогична ранее рассмотренной строкепараметру метода ToString и является комбинацией предопределённых символов форматирования и дополнительных целочисленных значений.
Символ форматирования |
Описание |
C |
Отображение значения как валюты с использованием принятого |
|
по соглашению символа |
D |
Отображение значения как decimal integer |
E |
Отображение значения в соответствии с научной нотацией |
F |
Отображение значения как fixed Point |
G |
Display the number as a fixed-Point or integer, depending on |
|
which is the most compact |
N |
Применение запятой для разделения порядков |
X |
Отображение значения в шестнадцатеричной нотации |
Непосредственно за символом форматирования может быть расположена целочисленная ограничительная константа, которая в зависимости от типа выводимого значения может определять количество выводимых знаков после точки, либо общее количество выводимых символов. При этом дробная часть действительных значений округляется, либо дополняется нулями справа. При выводе целочисленных значений ограничительная константа игнорируется, если
128
количество выводимых символов превышает её значение. В противном случае выводимое значение слева дополняется нулями.
Следующие примеры иллюстрируют варианты применения маркеров со строками форматирования:
Console.WriteLine(“Integer fotmating - {0:D3},{1:D5}”,12345, 12); Console.WriteLine(“Currency formatting – {0:C},{1:C5}”, 99.9, 999.9); Console.WriteLine(“Exponential formatting – {0:E}”, 1234.5); Console.WriteLine(“Fixed Point formatting – {0:F3}”, 1234.56789); Console.WriteLine(“General formatting – {0:G}”, 1234.56789); Console.WriteLine(“Number formatting – {0:N}”, 1234567.89); Console.WriteLine(“Hexadecimal formatting – {0:X7}”, 12345); // Integer types only!
В результате выполнения этих операторов в окно консольного приложения будут выведены следующие строки
Integer fotmating – 12345,00012
Currency formatting – $99.90,$999.90000
Exponential formatting – 1.234500E+003
Fixed Point formatting – 1234.568
General formatting – 1234.56789
Number formatting – 1,234,567.89
Hexadecimal formatting – 0003039
Функции вывода. Нестандартное (custom) форматирование значений.
Вмаркерах выражений вызова функций вывода могут также размещаться спецификаторы (custom format strings), реализующие возможности расширенного форматирования.
Вприведенной ниже таблице представлены символы, используемые для создания настраиваемых строк числовых форматов.
Следует иметь в виду, что на выходные строки, создаваемые с помощью некоторых из этих знаков, влияют настройки компонента “Язык и региональные стандарты” панели управления объекта NumberFormatInfo, связанного с текущим потоком. Результаты будут различными на компьютерах с разными параметрами культуры.
Знак |
Имя |
Описание |
|
|
|
|
|
|
|
|
|
|
|
|
|
формата |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
Знак-заместитель |
Цифра, |
|
расположенная |
|
в |
соответствующей |
позиции |
|||||||
|
нуля |
форматируемого |
значения |
будет |
скопирована |
в |
выходную |
||||||||
|
|
строку, если в этой позиции в строке формата |
|||||||||||||
|
|
присутствует “0”. Позиции крайних знаков «0» определяют |
|||||||||||||
|
|
знаки, всегда включаемые в выходную строку. Строка «00» |
|||||||||||||
|
|
приводит |
к |
округлению |
значения до ближайшего знака, |
||||||||||
|
|
предшествующего |
разделителю, |
если |
используется |
||||||||||
|
|
исключение из |
округления |
нуля. Например, в результате |
|||||||||||
|
|
форматирования числа 34,5 с помощью строки «00» будет |
|||||||||||||
|
|
получена строка “35”. |
|
|
|
|
|
|
|
|
|||||
# |
Заместитель цифры |
Цифра, |
|
расположенная |
|
в |
соответствующей |
позиции |
|||||||
|
|
форматируемого |
значения |
будет |
скопирована |
в |
выходную |
||||||||
|
|
строку, если в этой позиции в строке формата |
|||||||||||||
|
|
присутствует знак “#”. В противном случае в эту позицию |
|||||||||||||
|
|
ничего не записывается. Обратите внимание, что |
ноль не |
||||||||||||
|
|
будет |
отображен, |
если |
он |
не |
является |
значащей |
цифрой, |
||||||
|
|
даже |
если |
это |
единственный |
знак |
строки. |
Ноль |
|||||||
|
|
отображается, только если он является значащей цифрой |
|||||||||||||
|
|
форматируемого значения. Строка формата “##” приводит к |
|||||||||||||
|
|
округлению |
|
значения |
до |
ближайшего |
знака, |
||||||||
|
|
предшествующего |
разделителю, |
если |
используется |
||||||||||
|
|
исключение из округления нуля. Например, в результате |
|||||||||||||
|
|
форматирования числа 34,5 с помощью строки “##” будет |
|||||||||||||
|
|
получена строка «35». |
|
|
|
|
|
|
|
|
|||||
. |
Разделитель |
Первый |
знак |
“.” |
определяет |
расположение |
разделителя |
||||||||
|
|
целой |
и |
дробной |
частей, |
дополнительные |
знаки |
“.” |
|||||||
|
|
игнорируются. Отображаемый разделитель целой и |
дробной |
||||||||||||
|
|
частей определяется свойством NumberDecimalSeparator |
|||||||||||||
|
|
объекта NumberFormatInfo. |
|
|
|
|
|
|
|
||||||
, |
Разделитель тысяч |
Знак “,” |
применяется |
в двух |
случаях. |
Во-первых, |
если |
||||||||
129
|
|
|
знак |
“,” |
расположен |
в |
строке |
формата |
между |
знаками- |
|||||||
|
|
|
заместителями (0 или #) |
и слева от |
разделителя |
целой |
и |
||||||||||
|
|
|
дробной частей, то в выходной |
строке |
между |
группами |
из |
||||||||||
|
|
|
трех |
цифр |
в |
целой |
части |
числа |
|
будет |
вставлен |
||||||
|
|
|
разделитель тысяч. Отображаемый разделитель целой и |
||||||||||||||
|
|
|
дробной |
|
частей |
|
определяется |
свойством |
|||||||||
|
|
|
NumberGroupSeparator текущего объекта NumberFormatInfo. |
||||||||||||||
|
|
|
Во-вторых, если строка формата содержит один или |
||||||||||||||
|
|
|
несколько |
знаков |
“,” сразу |
после |
разделителя |
целой |
и |
||||||||
|
|
|
дробной частей, число будет разделено на 1000 столько |
||||||||||||||
|
|
|
раз, сколько раз знак “,” встречается в строке формата. |
||||||||||||||
|
|
|
Например, после форматирования строки “0,,” значение |
||||||||||||||
|
|
|
100000000 будет преобразовано в “100”. Применение этого |
||||||||||||||
|
|
|
знака для масштабирования не включает в строку |
||||||||||||||
|
|
|
разделитель тысяч. Таким образом, чтобы разделить число |
||||||||||||||
|
|
|
на миллион и вставить разделители тысяч следует |
||||||||||||||
|
|
|
использовать строку формата “#,##0,,”. |
|
|
|
|
|
|||||||||
% |
Заместитель |
При |
использовании |
этого |
|
знака |
|
число |
перед |
||||||||
|
процентов |
форматированием |
будет |
умножено |
|
на |
100. |
В |
|||||||||
|
|
|
соответствующую позицию выходной строки будет вставлен |
||||||||||||||
|
|
|
знак “%”. Знак процента определяется текущим классом |
||||||||||||||
|
|
|
NumberFormatInfo. |
|
|
|
|
|
|
|
|
|
|
||||
E0 |
Научная нотация |
Если в строке формата присутствует один из знаков “E”, |
|||||||||||||||
E+0 |
|
|
“E+”, “E-”, “e”, “e+” или “e-”, за которым следует по |
||||||||||||||
E-0 |
|
|
крайней мере |
один |
знак |
“0”, |
число |
представляется |
в |
||||||||
e0 |
|
|
научной нотации; между числом и экспонентой вставляется |
||||||||||||||
e+0 |
|
|
знак |
“E” |
или |
“e”. |
Минимальная |
|
длина |
экспоненты |
|||||||
e-0 |
|
|
определяется количеством нулей, расположенных за знаком |
||||||||||||||
|
|
|
формата. Знаки “E+” и “e+” устанавливают обязательное |
||||||||||||||
|
|
|
отображение знака “плюс” или “минус” перед экспонентой. |
||||||||||||||
|
|
|
Знаки “E”, “e”, “E-” и “e-” устанавливают отображение |
||||||||||||||
|
|
|
знака только для отрицательных чисел. |
|
|
|
|
|
|||||||||
\ |
Escape-знак |
В языке |
C# |
и |
управляемых |
расширениях |
C++ знак, |
||||||||||
|
|
|
следующий в строке формата за обратной косой чертой, |
||||||||||||||
|
|
|
воспринимается как escape-последовательность. Этот знак |
||||||||||||||
|
|
|
используется |
|
с |
обычными |
|
последовательностями |
|||||||||
|
|
|
форматирования (например, \n — новая строка). |
знак, |
в |
||||||||||||
|
|
|
Чтобы |
использовать |
обратную |
косую |
черту |
как |
|||||||||
|
|
|
некоторых языках ее необходимо удвоить. В противном |
||||||||||||||
|
|
|
случае она будет интерпретирована компилятором как |
||||||||||||||
|
|
|
escape-последовательность. Чтобы отобразить обратную |
||||||||||||||
|
|
|
косую черту, используйте строку “\\”. |
|
поддерживается |
в |
|||||||||||
|
|
|
Обратите внимание, что escape-знак |
не |
|||||||||||||
|
|
|
Visual Basic, однако объект ControlChars обладает |
||||||||||||||
|
|
|
некоторой функциональностью. |
|
|
|
|
|
|
|
|
||||||
'ABC' |
Строка букв |
Знаки, заключенные в одинарные или двойные кавычки, |
|||||||||||||||
"ABC" |
|
|
копируются в выходную строку без форматирования. |
|
|||||||||||||
; |
Разделитель |
Знак “;” служит для разделения секций положительных, |
|||||||||||||||
|
секций |
|
отрицательных чисел и нулей в строке формата. |
|
|
||||||||||||
Другие |
Все |
остальные |
Все остальные знаки копируются в выходную строку в |
||||||||||||||
|
знаки |
|
соответствующие позиции. |
|
|
|
|
|
|
|
|
|
|||||
Строки формата с фиксированной запятой (не содержащие подстрок “E0”, “E+0”, “E-0”, “e0”, “e+0” или “e-0”) ОКРУГЛЯЮТ значение с точностью, заданной количеством знаков-заместителей справа от разделителя целой и дробной частей.
Если в строке формата нет разделителя (точки), число округляется до ближайшего целого значения.
Если в целой части числа больше цифр, чем знаков-заместителей цифр, лишние
знаки копируются в выходную строку перед первым знаком-заместителем цифры. |
от |
||||
К строке может быть применено различное |
форматирование |
в |
зависимости |
||
того, |
является ли значение положительным, |
отрицательным |
или |
нулевым. |
Для |
этого |
следует создать строку формата, состоящую из трех секций, разделенных |
||||
точкой с запятой.
Одна секция. Строка формата используется для всех значений.
Две секции. Первая секция форматирует положительные и нулевые значения, вторая — отрицательные. Если число форматируется как отрицательное и становится нулем в результате округления в соответствии с форматированием, ноль форматируется в соответствии со строкой первой секции.
130
Три секции. Первая секция форматирует положительные значения, вторая — отрицательные, третья — нули. Вторая секция может быть пустой (две точки с запятой рядом), в этом случае первая секция будет использоваться для форматирования нулевых значений. Если число форматируется как ненулевое и становится нулем в результате округления в соответствии с форматированием, ноль форматируется в соответствии со строкой третьей секции.
При генерации выходной строки в этом типе форматирования не учитывается предыдущее форматирование. Например, при использовании разделителей секций отрицательные значения всегда отображаются без знака “минус”. Чтобы конечное форматированное значение содержало знак “минус”, его следует явным образом включить в настраиваемый указатель формата. В следующем примере демонстрируется применение разделителей секций для форматирования.
Следующий код демонстрирует использование разделителей секций при форматировании строки.
//Объявляются переменные с различными значения (положительное, отрицательное, нулевое) double MyPos = 19.95, MyNeg = -19.95, MyZero = 0.0;
string MyString = MyPos.ToString(“$#,##0.00;($#,##0.00);Zero”);
//In the U.S. English culture, MyString has the value: $19.95.
MyString = MyNeg.ToString(“$#,##0.00;($#,##0.00);Zero”);
//In the U.S. English culture, MyString has the value: ($19.95). MyString = MyZero.ToString(“$#,##0.00;($#,##0.00);Zero”);
//In the U.S. English culture, MyString has the value: Zero.
Следующая таблица иллюстрирует варианты представления выводимых значений в зависимости от используемых строк форматирования. Предполагается, что форматирование проводится в рамках ToString метода, а значения в столбце Формат соответствуют используемой строке форматирования.
В столбце Data type указывается тип форматируемого значения. В столбце Значение – значение, подлежащее форматированию. В столбце Вывод отображается результат форматирования строки для U.S. English параметров культуры.
Формат |
Data type |
Значение |
Вывод |
##### |
double |
123 |
123 |
00000 |
double |
123 |
00123 |
(###) ### - #### |
double |
1234567890 |
(123) 456 - 7800 |
#.## |
double |
1.2 |
1.2 |
0.00 |
double |
1.2 |
1.20 |
00.00 |
double |
1.2 |
01.20 |
#,# |
double |
1234567890 |
1,234,567,890 |
#,, |
double |
1234567890 |
12345 |
#,,, |
double |
1234567890 |
1 |
#,##0,, |
double |
1234567890 |
1,235 |
#0.##% |
double |
0.095 |
9.5% |
0.###E+0 |
double |
95000 |
9.5E+4 |
0.###E+000 |
double |
95000 |
9.5E+004 |
0.###E-000 |
double |
95000 |
9.5E004 |
[##-##-##] |
double |
123456 |
[12-34-56] |
##;(##) |
double |
1234 |
1234 |
##;(##) |
double |
-1234 |
(1234) |
И ещё один пример, демонструрующий custom number formatting.
Double myDouble = 1234567890;
String myString = myDouble.ToString( “(# ##) ### - ####” );
//The value of myString is “(123) 456 – 7890”. int MyInt = 42;
MyString = MyInt.ToString( “My Number \n= #” );
//In the U.S. English culture, MyString has the value:
//«My Number
//= 42».
131