Текст книги "C# 4.0: полное руководство"
Автор книги: Герберт Шилдт
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 64 (всего у книги 83 страниц)
Для заполнения строки справа служат следующие формы метода PadRight()
.
public string PadRight(int totalWidth)
public string PadRight(int totalWidth, char paddingChar)
В первой форме метода PadLeft() вводятся пробелы с правой стороны вызывающей строки, чтобы ее общая длина стала равной значению параметра totalWidth.
А во второй форме данного метода символы, обозначаемые параметром paddingChar, вводятся с правой стороны вызывающей строки, чтобы ее общая длина стала равной значению параметра totalWidth.B обеих формах возвращается получающаяся в итоге строка. Если значение параметра totalWidth меньше длины вызывающей строки, то возвращается копия неизмененной вызывающей строки.
В приведенном ниже примере программы демонстрируются обрезка и заполнение строк.
// Пример обрезки и заполнения строк.
using System;
class TrimPadDemo {
static void Main() {
string str = «тест»;
Console.WriteLine("Исходная строка: " + str);
// Заполнить строку пробелами слева,
str = str.PadLeft(10);
Console.WriteLine("|" + str + "|");
// Заполнить строку пробелами справа,
str = str.PadRight(20);
Console.WriteLine("|" + str + "|");
// Обрезать пробелы,
str = str.Trim();
Console.WriteLine("|" + str + "|");
// Заполнить строку символами # слева,
str = str.PadLeft(10, '#');
Console.WriteLine ("|" + str + "|");
// Заполнить строку символами # справа,
str = str.PadRight(20, '#');
Console.WriteLine("|" + str + "|");
// Обрезать символы #.
str = str.Trim('#');
Console.WriteLine("|" + str + "|");
}
}
Эта программа дает следующий результат.
Исходная строка: тест
| тест|
| тест |
|тест|
|######тест|
|######тест##########|
|тест|
Вставка, удаление и замена строк
Для вставки одной строки в другую служит приведенный ниже метод Insert()
:
public string Insert(int startlndex, string value)
где value обозначает строку, вставляемую в вызывающую строку по индексу startlndex. Метод возвращает получившуюся в итоге строку.
Для удаления части строки служит метод Remove()
. Ниже приведены две его формы.
public string Remove(int startlndex)
public string Remove(int startlndex, int count)
В первой форме метода Remove()
удаление выполняется, начиная с места, указываемого по индексу startlndex, и продолжается до конца строки. А во второй форме данного метода из строки удаляется количество символов, определяемое параметром count, начиная с места, указываемого по индексу startlndex. В обеих формах возвращается получающаяся в итоге строка.
Для замены части строки служит метод Replace()
. Ниже приведены две его формы.
public string Replace(char oldChar, char newChar)
public string Replace(string oldValue, string newValue)
В первой форме метода Replace()
все вхождения символа oldChar в вызывающей строке заменяются символом newChar. А во второй форме данного метода все вхождения строки oldValue в вызывающей строке заменяются строкой newValue. В обеих формах возвращается получающаяся в итоге строка.
В приведенном ниже примере демонстрируется применение методов Insert(), Remove() и Replace().
// Пример вставки, замены и удаления строк.
using System;
class InsRepRevDemO {
static void Main() {
string str = «Это тест»;
Console.WriteLine("Исходная строка: " + str);
// Вставить строку.
str = str.Insert(4, "простой ");
Console.WriteLine(str) ;
// Заменить строку.
str = str.Replace(«простой», "непростой ");
Console.WriteLine (str);
// Заменить символы в строке
str = str.Replace('т', 'X');
Console.WriteLine(str);
// Удалить строку, str = str.Remove(4, 5);
Console.WriteLine(str);
}
}
Ниже приведен результат выполнения этой программы.
Исходная строка: Это тест
Это простой тест
Это непростой тест
ЭХо непросХой ХесХ
ЭХо сХой ХесХ
Смена регистра
В классе String предоставляются два удобных метода, позволяющих сменить регистр букв в строке, – ToUpper()
и ToLower()
. Диже приведены их простейшие формы.
public string ToLower()
public string ToUpper()
Метод ToLower()
делает строчными все буквы в вызывающей строке, а метод ToUpper()
делает их прописными. В обоих случаях возвращается получающаяся в итоге строка. Имеются также следующие формы этих методов, в которых можно указывать информацию о культурной среде и способы преобразования символов.
public string ToLower (Culturelnfo culture)
public string ToUpper(Culturelnfo culture)
С помощью этих форм можно избежать неоднозначности в исходном коде по отношению к правилам смены регистра. Именно для таких целей эти формы и рекомендуется применять.
Кроме того, имеются следующие методы ToUpperInvariant()
и ToLowerlnvariant()
.
public string ToUpperlnvariant()
public string ToLowerlnvariant()
Эти методы аналогичны методам ToUpper()
и ToLower()
, за исключением того, что они изменяют регистр букв в вызывающей строке безотносительно к настройкам культурной среды.
Применение метода Substring()
Для получения части строки служит метод Substring()
. Ниже приведены две его формы.
public string Substring(int startlndex)
public string Substring(int startlndex, int length)
В первой форме метода Substring()
подстрока извлекается, начиная с места, обозначаемого параметром startlndex, и до конца вызывающей строки. А во второй форме данного метода извлекается подстрока, состоящая из количества символов, определяемых параметром length, начиная с места, обозначаемого параметром startlndex. В обеих формах возвращается получающаяся в итоге подстрока.
В приведенном ниже примере программы демонстрируется применение метода Substring().
// Использовать метод Substring().
using System;
class SubstringDemo {
static void Main() {
string str = «ABCDEFGHIJKLMNOPQRSTUVWXYZ»;
Console.WriteLine("Строка str: " + str);
Console.Write("Подстрока str.Substring(15): ");
string substr = str.Substring(15);
Console.WriteLine(substr);
Console.Write("Подстрока str.Substring(0, 15): ");
substr = str.Substring(0, 15);
Console.WriteLine (substr);
}
}
Эта программа дает следующий результат.
Строка str: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Подстрока str.Substring(15): PQRSTUVWXYZ
Подстрока' str. Substring (0, 15): ABCDEFGHIJKLMNO
Методы расширения класса String
Как упоминалось ранее, в классе String
реализуется обобщенный интерфейс IEnumerable
. Это означает, что, начиная с версии C# 3.0, для объекта класса String
можно вызывать методы расширения, определенные в классах Enumerable
и Queryable
, которые находятся в пространстве имен System.Linq
. Эти методы расширения служат главным образом для поддержки LINQ, хотя некоторые из них могут использоваться в иных целях, в том числе и в определенных видах обработки строк. Подробнее о методах расширения см. в главе 19.
Когда данные встроенных в C# типов, например int
или double
, требуется отобразить в удобочитаемой форме, приходится формировать их строковое представление. Несмотря на то что в C# для такого представления данных автоматически предоставляется формат, используемый по умолчанию, имеется также возможность указать выбранный формат вручную. Так, в части I этой книги было показано, что числовые данные можно выводить в формате выбранной денежной единицы. Для форматирования данных числовых типов в C# предусмотрен целый ряд методов, включая методы Console.WriteLine()
, String.Format()
и ToString()
. Во всех этих методах применяется один и тот же подход к форматированию. Поэтому освоив один из них, вы сможете без особого труда применять и другие.
Общее представление о форматировании
Форматирование осуществляется с помощью двух компонентов: спецификаторов формата и поставщиков формата. Конкретная форма строкового представления отдельного значения зависит от спецификатора формата. Следовательно, спецификатор формата определяет, в какой именно удобочитаемой форме будут представлены данные. Например, для вывода числового значения в экспоненциальном представлении (т.е. в виде мантиссы и порядка числа) используется спецификатор формата Е.
Как правило, конкретный формат значения зависит от культурных и языковых особенностей локализации программного обеспечения. Например, в Соединенных Штатах Америки денежные суммы указываются в долларах, а в странах ЕС – в евро. Для учета культурных и языковых отличий в C# предусмотрены поставщики формата. В частности, поставщик формата определяет порядок интерпретации спецификатора формата. Поставщик формата создается путем реализации интерфейса IFormatProvider
, в котором определяется метод GetFormat()
. Для всех встроенных числовых типов и многих других типов данных в среде .NET Framework предопределены соответствующие поставщики формата. Вообще говоря, данные можно отформатировать, не указывая конкретный поставщик формата, поэтому поставщики формата не рассматриваются далее в этой книге.
Для того чтобы отформатировать данные, достаточно включить спецификатор формата в метод, поддерживающий форматирование. О применении спецификаторов формата речь уже шла в главе 3, тем не менее к этому вопросу стоит вернуться вновь. Применение спецификаторов формата рассматривается далее на примере метода Console.WriteLine()
, хотя аналогичный подход применим и к другим методам, поддерживающим форматирование.
Для форматирования выводимых данных служит следующая форма метода WriteLine()
.
WriteLine(«форматирующая строка», arg0, arg1, ... , argN) ;
В этой форме аргументы метода WriteLine()
разделяются запятой, а не знаком +. А форматирующая строка состоит из двух следующих элементов: обычных печатаемых символов, отображаемых в исходном виде, а также команд форматирования.
Ниже приведена общая форма команд форматирования:
{argnum, width: fmt}
где argnum – это номер отображаемого аргумента, начиная с нуля; width – минимальная ширина поля, a fmt — спецификатор формата. Параметры width и fmt не являются обязательными. Поэтому в своей простейшей форме команда форматирования просто указывает конкретные аргументы для отображения. Например, команда { 0 } указывает аргумент агд0, команда {1} – аргумент arg1 и т.д.
Если во время выполнения программы в форматирующей строке встречается команда форматирования, то вместо нее подставляется и затем отображается соответствующий аргумент, определяемый параметром argnum. Следовательно, от положения спецификатора формата в форматирующей строке зависит, где именно будут отображаться соответствующие данные. А номер аргумента определяет конкретный форматируемый аргумент.
Если в команде форматирования указывается параметр fmt, то данные отображаются в указываемом формате. В противном случае используется формат, выбираемый по умолчанию. Если же в команде форматирования указывается параметр width, то выводимые данные дополняются пробелами для достижения минимально необходимой ширины поля. При положительном значении параметра width выводимые данные выравниваются по правому краю, а при отрицательном значении – по левому краю.
Оставшаяся часть данной главы посвящена вопросам форматирования и отдельным спецификаторам формата.
Спецификаторы формата числовых данных
Для числовых данных определено несколько спецификаторов формата, сведенных в табл. 22.4. Каждый спецификатор формата может включать в себя дополнительный, но необязательный спецификатор точности. Так, если числовое значение требуется указать в формате с фиксированной точкой и двумя десятичными разрядами в дробной части, то для этой цели служит спецификатор F2.
Таблица 22.4. Спецификатооы формата числовых данных
Спецификатор
Формат – Назначение спецификатора точности
C
Денежная единица
Задает количество десятичных разрядов
с
То же, что и С
D
Целочисленный (используется только с
целыми числами)
Задает минимальное количество цифр. При необходимости результат дополняется начальными нулями
d
То же, что и D
Е
Экспоненциальное представление чисел (в обозначении используется прописная буква Е)
Задает количество десятичных разрядов. По умолчанию используется шесть рязрядов
е
Экспоненциальное представление чисел (в обозначении используется строчная буква е)
Задает количество десятичных разрядов. По умолчанию используется шесть рязрядов
F
Представление чисел с фиксированной точкой
Задает количество десятичных разрядов
f
То же, что и F
G
Используется более короткий из двух форматов: Е или F
См. спецификаторы Е и F
g
Используется более короткий из двух форматов: е или f
См. спецификаторы е и f
N
Представление чисел с фиксированной точкой (и запятой в качестве разделителя групп разрядов)
Задает количество десятичных разрядов
n
То же, что и N
P
Проценты
Задает количество десятичных разрядов
р
То же, что и Р
R или г
Числовое значение, которое преобразуется с помощью метода Parse() в эквивалентную внутреннюю форму. (Это так называемый “круговой” формат)
Не используется
X
Шестнадцатеричный (в обозначении используются прописные буквы A-F)
Задает минимальное количество цифр. При необходимости результат дополняется начальными нулями
x
Шестнадцатеричный (в обозначении используются строчные буквы A-F)
Задает минимальное количество цифр. При необходимости результат дополняется начальными нулями
Как пояснялось выше, конкретное действие спецификаторов формата зависит от текущих настроек параметров культурной среды. Например, спецификатор денежной единицы С
автоматически отображает числовое значение в формате денежной единицы, выбранном для локализации программного обеспечения в конкретной культурной среде. Для большинства пользователей используемая по умолчанию информация о культурной среде соответствует их региональным стандартам и языковым особенностям. Поэтому один и тот же спецификатор формата может использоваться без учета культурного контекста, в котором выполняется программа.
В приведенной ниже программе демонстрируется применение нескольких спецификаторов формата числовых данных.
// Продемонстрировать применение различных
// спецификаторов формата числовых данных.
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 %
15
000000000021
$189.99
Обратите внимание на действие спецификатора точности в нескольких форматах.
Представление о номерах аргументов
Следует иметь в виду, что аргумент, связанный со спецификатором формата, определяется номером аргумента, а не его позицией в списке аргументов. Это означает, что один и тот же аргумент может указываться неоднократно в одном вызове метода WriteLine()
. Эта также означает, что аргументы могут отображаться в той последовательности, в какой они указываются в списке аргументов. В качестве примера рассмотрим следующую программу.
using System;
class FormatDemo2 {
static void Main() {
// Форматировать один и тот же аргумент тремя разными способами.
Console.WriteLine(«{0:F2} {0:F3} {0:e}», 10.12345);
// Отобразить аргументы не по порядку.
Console.WriteLine(«{2:d} {0:d} {l:d}», 1, 2, 3) ;
}
}
Ниже приведен результат выполнения этой программы.
10.12 10.123 1.012345е+001
3 1 2
В первом операторе вызова метода WriteLine()
один и тот же аргумент 10.12345
форматируется тремя разными способами. Это вполне допустимо, поскольку каждый спецификатор формата в этом вызове обозначает первый и единственный аргумент. А во втором вызове метода WriteLine()
три аргумента отображаются не по порядку. Не следует забывать, что каких-то особых правил, предписывающих обозначать аргументы в спецификаторах формата в определенной последовательности, не существует. Любой спецификатор формата может обозначать какой угодно аргумент.
Несмотря на все удобства встраивания команд форматирования выводимых данных в вызовы метода WriteLine()
, иногда все же требуется сформировать строку, содержащую отформатированные данные, но не отображать ее сразу. Это дает возможность отформатировать данные заранее, чтобы вывести их в дальнейшем на выбранное устройство. Такая возможность особенно полезна для организации работы в среде с графическим пользовательским интерфейсом, подобной Windows, где ввод-вывод на консоль применяется редко, а также для подготовки вывода на веб-страницу.
Вообще говоря, отформатированное строковое представление отдельного значения может быть получено двумя способами. Один из них состоит в применении метода String.Format()
, а другой – в передаче спецификатора формата методу ToString()
, относящемуся к одному из встроенных в C# числовых типов данных. Оба способа рассматриваются далее по порядку.
Применение метода String. Format() для форматирования значений
Для получения отформатированного значения достаточно вызвать метод Format(), определенный в классе String, в соответствующей его форме. Все формы этого метода перечислены в табл. 22.5. Метод Format() аналогичен методу WriteLine(), за исключением того, что он возвращает отформатированную строку, а не выводит ее на консоль.
Метод – Описание
public static string Format(stringformat, object arg0) – Форматирует объект arg0 в соответствии с первой командой форматирования, которая содержится в строке format. Возвращает копию строки format, в которой команда форматирования заменена отформатированными данными
public static string Format(stringformat, object arg0,objectarg1) – Форматирует объект arg0 в соответствии с первой командой форматирования, содержащейся в строке format, а объект arg1 — в соответствии со второй командой. Возвращает копию строки format, в которой команды форматирования заменены отформатированными данными
public static string Format(stringformat, object arg0,objectarg1, object arg2) – Форматирует объекты arg0, arg1 и агд2 по соответствующим командам форматирования, содержащимся в строке format. Возвращает копию строки format, в которой команды форматирования заменены отформатированными данными
public static string Format (stringformat, params object[]args) – Форматирует значения, передаваемые в массиве args, в соответствии с командами форматирования, содержащимися в строке format. Возвращает копию строки format, в которой команды форматирования заменены отформатированными данными
public static string Format (IFormatProvider provider,stringformat, params object[]args) – Форматирует значения, передаваемые в массиве args, в соответствии с командами форматирования, содержащимися в строке format, используя поставщик формата 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=1; i <= 10; i++) {
sum += i;
prod *= i;
str = String.Format(«Сумма:{0,3:D} Произведение:{1,8:D}»,
sum, prod);
Console.WriteLine(str);
}
}
}
Ниже приведен результат выполнения этой программы
Сумма: 1 Произведение: 1
Сумма: 3 Произведение: 2
Сумма: 6 Произведение: 6
Сумма: 10 Произведение: 24
Сумма: 15 Произведение: 120
Сумма: 21 Произведение: 720
Сумма: 28 Произведение: 5040
Сумма: 36 Произведение: 40320
Сумма: 45 Произведение: 362880
Сумма: 55 Произведение: 3628800
Обратите особое внимание в данной программе на следующий оператор.
str = String.Format(«Сумма:{0,3:D} Произведение:{1,8:D}», sum, prod);
В этом операторе содержится вызов метода Format()
с двумя спецификаторами формата: одним – для суммы (в переменной sum), а другим – для произведения (в переменной prod). Обратите также внимание на то, что номера аргументов указываются таким же образом, как и в вызове метода WriteLine()
, и что в вызов метода Format()
включается обычный текст, как, например, строка "Сумма : ". Этот текст передается данному методу и становится частью выводимой строки.
Применение метода ToString() для форматирования данных
Для получения отформатированного строкового представления отдельного значения любого числового типа, которому соответствует встроенная структура, например Int32
или Double
, можно воспользоваться методом ToString()
. Этой цели служит приведенная ниже форма метода ToString()
.
public string ToString(«форматирующая строка»)
В этой форме метод ToString()
возвращает строковое представление вызывающего объекта в том формате, который определяет спецификатор «форматирующая строка», передаваемый данному методу. Например, в следующей строке кода формируется строковое представление значения 188.99 в формате денежной единицы с помощью спецификатора формата С
.
string str = 189.99.ToString("С");
Обратите внимание на то, что спецификатор формата передается методу ToString()
непосредственно. В отличие от встроенных команд форматирования, используемых в вызовах методов WriteLine()
и Format()
, где для этой цели дополнительно указываются номер аргумента и ширина поля, в вызове метода ToString()
достаточно указать только спецификатор формата.
Ниже приведен вариант примера предыдущей программы форматирования, измененный с целью продемонстрировать применение метода ToString()
для получения отформатированных строк. Этот вариант дает такой же результат, как и предыдущий.
// Использовать метод ToString() для форматирования значений.
using System;
class ToStringDemo {
static void Main() {
double v = 17688.65849;
double v2 = 0.15;
int x = 21;
string str = v.ToString(«F2»);
Console.WriteLine(str);
str = v.ToString(«N5»);
Console.WriteLine(str);
str = v.ToString("e");
Console.WriteLine(str);
str = v.ToString("r");
Console.WriteLine(str);
str = v2.ToString("p");
Console.WriteLine(str);
str = x.ToString("X");
Console.WriteLine(str);
str = x.ToString(«D12»);
Console.WriteLine(str);
str = 189.99.ToString("C");
Console.WriteLine(str);
}
}