Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Функции вывода. Нестандартное (custom) форматирование значений.

В маркерах выражений вызова функций вывода могут также размещаться спецификаторы (custom format strings), реализующие возможности расширенного форматирования.

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

Следует иметь в виду, что на выходные строки, создаваемые с помощью некоторых из этих знаков, влияют настройки компонента “Язык и региональные стандарты” панели управления объекта NumberFormatInfo, связанного с текущим потоком. Результаты будут различными на компьютерах с разными параметрами культуры.

Знак формата

Имя

Описание

0

Знак-заместитель нуля

Цифра, расположенная в соответствующей позиции форматируемого значения будет скопирована в выходную строку, если в этой позиции в строке формата присутствует “0”. Позиции крайних знаков «0» определяют знаки, всегда включаемые в выходную строку. Строка «00» приводит к округлению значения до ближайшего знака, предшествующего разделителю, если используется исключение из округления нуля. Например, в результате форматирования числа 34,5 с помощью строки «00» будет получена строка “35”.

#

Заместитель цифры

Цифра, расположенная в соответствующей позиции форматируемого значения будет скопирована в выходную строку, если в этой позиции в строке формата присутствует знак “#”. В противном случае в эту позицию ничего не записывается. Обратите внимание, что ноль не будет отображен, если он не является значащей цифрой, даже если это единственный знак строки. Ноль отображается, только если он является значащей цифрой форматируемого значения. Строка формата “##” приводит к округлению значения до ближайшего знака, предшествующего разделителю, если используется исключение из округления нуля. Например, в результате форматирования числа 34,5 с помощью строки “##” будет получена строка «35».

.

Разделитель

Первый знак “.” определяет расположение разделителя целой и дробной частей, дополнительные знаки “.” игнорируются. Отображаемый разделитель целой и дробной частей определяется свойством NumberDecimalSeparator объекта NumberFormatInfo.

,

Разделитель тысяч

Знак “,” применяется в двух случаях. Во-первых, если знак “,” расположен в строке формата между знаками-заместителями (0 или #) и слева от разделителя целой и дробной частей, то в выходной строке между группами из трех цифр в целой части числа будет вставлен разделитель тысяч. Отображаемый разделитель целой и дробной частей определяется свойством NumberGroupSeparator текущего объекта NumberFormatInfo.

Во-вторых, если строка формата содержит один или несколько знаков “,” сразу после разделителя целой и дробной частей, число будет разделено на 1000 столько раз, сколько раз знак “,” встречается в строке формата. Например, после форматирования строки “0,,” значение 100000000 будет преобразовано в “100”. Применение этого знака для масштабирования не включает в строку разделитель тысяч. Таким образом, чтобы разделить число на миллион и вставить разделители тысяч следует использовать строку формата “#,##0,,”.

%

Заместитель процентов

При использовании этого знака число перед форматированием будет умножено на 100. В соответствующую позицию выходной строки будет вставлен знак “%”. Знак процента определяется текущим классом NumberFormatInfo.

E0

E+0

E-0

e0

e+0

e-0

Научная нотация

Если в строке формата присутствует один из знаков “E”, “E+”, “E-”, “e”, “e+” или “e-”, за которым следует по крайней мере один знак “0”, число представляется в научной нотации; между числом и экспонентой вставляется знак “E” или “e”. Минимальная длина экспоненты определяется количеством нулей, расположенных за знаком формата. Знаки “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”) ОКРУГЛЯЮТ значение с точностью, заданной количеством знаков-заместителей справа от разделителя целой и дробной частей.

Если в строке формата нет разделителя (точки), число округляется до ближайшего целого значения.

Если в целой части числа больше цифр, чем знаков-заместителей цифр, лишние знаки копируются в выходную строку перед первым знаком-заместителем цифры.

К строке может быть применено различное форматирование в зависимости от того, является ли значение положительным, отрицательным или нулевым. Для этого следует создать строку формата, состоящую из трех секций, разделенных точкой с запятой.

  • Одна секция. Строка формата используется для всех значений.

  • Две секции. Первая секция форматирует положительные и нулевые значения, вторая — отрицательные. Если число форматируется как отрицательное и становится нулем в результате округления в соответствии с форматированием, ноль форматируется в соответствии со строкой первой секции.

  • Три секции. Первая секция форматирует положительные значения, вторая — отрицательные, третья — нули. Вторая секция может быть пустой (две точки с запятой рядом), в этом случае первая секция будет использоваться для форматирования нулевых значений. Если число форматируется как ненулевое и становится нулем в результате округления в соответствии с форматированием, ноль форматируется в соответствии со строкой третьей секции.

При генерации выходной строки в этом типе форматирования не учитывается предыдущее форматирование. Например, при использовании разделителей секций отрицательные значения всегда отображаются без знака “минус”. Чтобы конечное форматированное значение содержало знак “минус”, его следует явным образом включить в настраиваемый указатель формата. В следующем примере демонстрируется применение разделителей секций для форматирования.

Следующий код демонстрирует использование разделителей секций при форматировании строки.

// Объявляются переменные с различными значения (положительное, отрицательное, нулевое)

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».