Знакомство с Microsoft .NET Framework. Часть 5. Класс System.StringИсточник: КомпьютерПресс, 7'2002 Алексей Федоров
Оглавление
Мы продолжаем знакомство с Microsoft .NET Framework и библиотекой классов .NET Framework Class Library. В этой статье мы рассмотрим строки и класс System.String, а также ознакомимся с некоторыми способами форматирования, доступными в библиотеке классов .NET Framework Class Library. СтрокиКласс System.String содержит методы, применяемые для манипуляций со строками. С помощью методов этого класса мы можем определить длину строки, выполнить поиск подстрок, изменить регистр символов в строке, сравнить две строки, разделить строки на подстроки и выполнить ряд других действий. После того как экземпляр класса String создан, он не может быть изменен - все методы класса, которые изменяют содержимое стоки, возвращают новый экземпляр данного класса. Класс StringBuilder, находящийся в пространстве имен System.Text, используется для создания строк, содержимое которых может быть модифицировано. В Microsoft .NET первый символ строки имеет нулевой индекс. Класс String реализует интерфейсы IComparable, ICloneable, IConvertible и IEnumerable. Мы уже знакомы с интерфейсом IEnumerable - мы рассмотрели его в предыдущей статье данного цикла. Интерфейс IComparable содержит объявление метода CompareTo, который реализующие данный интерфейс классы используют для того, чтобы обеспечить поддержку сортировки экземпляров класса. Интерфейс ICloneable задает метод Clone, который используется в тех случаях, когда классу необходимо следить за созданием копий экземпляров данного класса. Интерфейс IConvertible задает методы, которые используются при преобразовании между типами, поддерживаемыми Common Language Runtime, и другими типами. Класс String содержит два свойства: свойство Chars(Integer), которое возвращает символ в указанной позиции, и свойство Length, возвращающее число символов в строке. Ниже показан пример использования этих свойств, в котором мы выводим содержимое строки по одному символу.
Метод IndexOf(Char) используется для нахождения первой копии подстроки в данной строке. Он возвращает начальную позицию подстроки, если она найдена, или -1 - в противном случае. Перегруженные версии метода IndexOf позволяют указывать параметры типа Char, String или массив элементов Char. Ниже показано, как использовать данный метод:
Метод IndexOf() имеет два опциональных параметра, способных ограничить поиск за счет указания начальной и конечной позиции в строке, в которой выполняется поиск. Метод LastIndexOf() также используется для поиска подстроки, только он ищет последний экземпляр указанной подстроки в данной строке. Для изменения регистра символов в строке - приведения символов к верхнему или нижнему регистру - используются методы ToUpper() и ToLower() соответственно. Для сравнения двух строк мы используем одну из перегруженных версий метода Compare. Этот метод возвращает 0, если сравниваемые строки идентичны, отрицательное число, если первая строка меньше второй, или положительное число, если первая строка больше второй. По умолчанию сравнение строк выполняется с учетом регистра символов. Для того чтобы регистр символов игнорировался при сравнении строк, третий опциональный параметр метода Compare должен иметь значение True. Например, два следующих сравнения возвращают разные результаты:
Для преобразования строки в массив подстрок используется метод Split(ParamArray Char()). При вызове этого метода указывается символ, который считается символом, разделяющим подстроки, - это может быть пробел, запятая и т.п. В следующем примере показано использование метода Split:
Метод Join(String, String()) служит для объединения элементов массива в строку. После того как мы рассмотрели основные методы класса String, давайте кратко ознакомимся с другими методами, реализованными в данном классе:
Отметим, что в приведенном выше примере мы использовали свойство Length класса String в строке, заданной литералом - это еще один способ использования класса String без создания экземпляра данного класса. Пространство имен System.TextПространство имен System.Text содержит классы, которые представляют собой различные кодировки символов, а также предоставляют вспомогательные классы для манипуляции объектами типа String, включая операции форматирования. Класс StringBuilder может использоваться совместно с классом String для манипуляции строками. Этот класс полезен в тех случаях, когда нам требуется модифицировать содержимое экземпляра класса String - вставить, заменить или удалить символы - без создания новой строки. Для выполнения необходимой операции мы используем методы Insert, Replace и Remove, предоставляемые классом StringBuilder. Доступ к отдельным символам в строке возможен через свойство Chars, которое обеспечивает посимвольную манипуляцию строками. Пространство имен System.Text также содержит ряд преобразователей - классов, которые реализуют различные кодировки символов и используются для преобразования между ними, включая кодировки ASCII (класс ASCIIEncoding), UTF-7 (класс UTF7Encoding), UTF-8 (класс UTF8Encoding), Unicode (класс UnicodeEncoding) и кодовые страницы Windows:
Все вышеперечисленные классы наследуют классу Encoding, который задает базовую функциональность этих классов.
После того как мы ознакомились с массивами, коллекциями и строками, давайте рассмотрим способы форматирования, доступные в библиотеке классов. ФорматированиеИз рассказа о классе Object мы уже знаем, что каждый класс в библиотеке классов .NET Framework Class Library содержит метод ToString(). Реализация этого метода зависит от конкретного класса, но для типов со значениями, особенно для примитивных типов, мы можем использовать данный метод для вывода значений, хранимых в переменных того или иного типа. В следующих разделах мы рассмотрим, как использовать различные спецификаторы формата для того, чтобы сформатировать значения как десятичные, экспоненциальные, шестнадцатеричные и т.п. Форматирование по умолчаниюПо умолчанию, когда мы используем метод Console.WriteLine() или любой другой метод, преобразующий значение в тип String, реальное преобразование выполняет метод ToString(). Например, следующий код:
выведет данные, как и ожидается, - 123.45. Для простого отображения данных этого вполне достаточно, но если мы захотим, например, отобразить значение переменной Amount как «денежное» значение (currency) или в любом другом формате, то нам нужны более мощные средства. И здесь нам на помощь приходят специальные спецификаторы форматов. Мы рассмотрим эти спецификаторы ниже. Форматирование типа CurrencyДля форматирования значения как «денежного», мы используем спецификатор C (или c), как показано в следующем примере:
Приведенный выше код выводит: Amount: $123.45, Saldo: $94.20. Если теперь мы изменим значение страны:
то мы получим значения, специфические для той или иной страны, то есть включающие символ той или иной валюты: евро для Франции, фунты стерлингов для Великобритании и швейцарские франки для Швейцарии: Форматирование типа DecimalЭтот тип форматирования указывается спецификатором D (или d). Помимо этого можно указать точность преобразования - минимальное число отображаемых цифр. Например, следующий код:
выводит такие данные: Форматирование типа Exponential
Мы используем этот формат (который также называется «инженерным» форматом; спецификатор E или e) для преобразования значений в экспоненциальное представление. Мы также можем указать точность преобразования - число символов после десятичной точки. Так, следующий код:
выводит следующие данные:
что приведет к следующему результату: Форматирование типа Fixed-point
Форматирование чисел с фиксированной точкой (спецификатор F или f) используется для преобразования десятичных чисел путем добавления указанного числа нулей (по умолчанию два) после десятичной точки. В частности, код:
выводит такие данные: Форматирование типа General
Этот тип форматирования (спецификатор G или g) используется для преобразования значения либо в формат с фиксированной точкой, либо в «научный» формат. Максимальная точность для типа Double - 17, а точность по умолчанию - 15. Точность можно указывать вместе со спецификатором. Например, код:
выводит следующие данные: Форматирование типа Number
Данный формат (спецификатор N или n) используется для преобразования значения в форму [-]d,ddd,ddd.dd. Следующий пример показывает, как выполняется это преобразование:
Форматирование типа Percent
Мы используем данный формат (спецификатор P или p) для представления числового значения в виде процента. Следующий пример демонстрирует применение этого типа форматирования:
Форматирование типа Round-trip
Этот формат (спецификатор R или r) используется при необходимости гарантии того, что преобразованное число может быть преобразовано обратно в первоначальную величину. Форматирование типа Hexadecimal
Данный формат (спецификатор X или x) применяется в тех случаях, когда необходимо шестнадцатеричное представление значения. Использование данного типа форматирования показано на следующем примере:
Форматирование типа Picture Numeric
Мы уже использовали шаблоны при рассмотрении различных спецификаторов форматов. Они имеют форму {0:xy}, где x - один из существующих спецификаторов, а y - указатель точности. Помимо простых шаблонов мы можем использовать и более комплексные. Некоторые из таких шаблонов показаны в следующем примере:
Мы можем использовать спецификаторы форматов G, F, D и X (или их эквиваленты в нижнем регистре) для преобразования имен членов перечислений в их строчные эквиваленты. Следующий пример показывает, как это сделать:
Примечание. В библиотеке классов Microsoft .NET Framework Library также поддерживаются различные опции форматирования значений даты и времени. Мы ознакомимся с ними в одной из наших следующих статей. ЗаключениеВ этой части статьи мы рассмотрели использование строк, классов System.String, System.Text. StringBuilder, а также рассказали об использовании различных спецификаторов форматирования. Следующий этап в освоении библиотеки классов Microsoft .NET Framework Library - потоки, поддержка файловой системы и сетевые функции. Об этом мы поговорим в следующей статье. |