Вы находитесь на страницах старой версии сайта.
Переходите на новую версию Interface.Ru

СТАТЬЯ
15.12.02


Предыдущая часть

Знакомство с Microsoft .NET Framework
Часть 5. Класс System.String

© Алексей Федоров
Статья была опубликована в журнале "КомпьютерПресс"

Мы продолжаем знакомство с 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, возвращающее число символов в строке. Ниже показан пример использования этих свойств, в котором мы выводим содержимое строки по одному символу.

'---------------------------------------
' .NET String Demo
'---------------------------------------

Imports System
Imports System.String

Module Module1

Sub Main()

Dim Str As String
Dim I As Integer

Str = "Microsoft .NET"

While I <= Str.Length - 1
Console.WriteLine(Str.Chars(I))
I += 1
End While

End Sub

End Modul
e

Метод IndexOf(Char) используется для нахождения первой копии подстроки в данной строке. Он возвращает начальную позицию подстроки, если она найдена, или –1 — в противном случае. Перегруженные версии метода IndexOf позволяют указывать параметры типа Char, String или массив элементов Char. Ниже показано, как использовать данный метод:

'---------------------------------------
' .NET Strings Demo
'---------------------------------------

Imports System
Imports System.String

Module Module1


Sub Main()

Dim Str As String
Dim Ch As Char
Dim Chars As Char() = {".", "N", "E", "T"}
Str = "Microsoft .NET"
Ch = "."
Console.WriteLine(Str.IndexOf(".NET")) 'returns 10
Console.WriteLine(Str.IndexOf(Ch)) 'returns 10
Console.WriteLine(Str.IndexOf(Chars)) 'returns 10

End Sub

End Module

Метод IndexOf() имеет два опциональных параметра, способных ограничить поиск за счет указания начальной и конечной позиции в строке, в которой выполняется поиск.

Метод LastIndexOf() также используется для поиска подстроки, только он ищет последний экземпляр указанной подстроки в данной строке.

Для изменения регистра символов в строке — приведения символов к верхнему или нижнему регистру — используются методы ToUpper() и ToLower() соответственно.

Для сравнения двух строк мы используем одну из перегруженных версий метода Compare. Этот метод возвращает 0, если сравниваемые строки идентичны, отрицательное число, если первая строка меньше второй, или положительное число, если первая строка больше второй. По умолчанию сравнение строк выполняется с учетом регистра символов. Для того чтобы регистр символов игнорировался при сравнении строк, третий опциональный параметр метода Compare должен иметь значение True.

Например, два следующих сравнения возвращают разные результаты:

Str = “Microsoft .NET”
Console.WriteLine(Str.Compare(Str.ToUpper, Str.ToLower)) ‘ 1
Console.WriteLine(Str.Compare(Str.ToUpper, Str.ToLower, True)) ‘ 0

Для преобразования строки в массив подстрок используется метод Split(ParamArray Char()). При вызове этого метода указывается символ, который считается символом, разделяющим подстроки, — это может быть пробел, запятая и т.п. В следующем примере показано использование метода Split:

'---------------------------------------
' .NET Strings Demo
'---------------------------------------

Imports System
Imports System.String

Module Module1

Sub Main()

Dim Str As String
Dim Words() As String
Dim I As Integer

Str = "Microsoft .NET Platform"
Words = Str.Split(" ")
For I = 0 To Words.GetUpperBound(0)
Console.WriteLine(I & " : " & Words(I))
Next

End Sub

End Module

Метод 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(). Например, следующий код:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()

Dim Amount As Decimal = 123.45
Console.WriteLine(Amount)

End Sub

End Module

выведет данные, как и ожидается, — 123.45. Для простого отображения данных этого вполне достаточно, но если мы захотим, например, отобразить значение переменной Amount как «денежное» значение (currency) или в любом другом формате, то нам нужны более мощные средства. И здесь нам на помощь приходят специальные спецификаторы форматов. Мы рассмотрим эти спецификаторы ниже.

Форматирование типа Currency

Для форматирования значения как «денежного», мы используем спецификатор C (или c), как показано в следующем примере:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()

Dim Amount As Decimal = 123.45
Dim Saldo As Decimal = 94.20

Console.WriteLine("Amount: {0:C}, Saldo: {1:C}", Amount, Saldo)
End Sub

End Module

Приведенный выше код выводит: Amount: $123.45, Saldo: $94.20. Если теперь мы изменим значение страны:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System.Globalization
Imports System.Threading

Module Formatting

Sub Main()
Dim Cult As CultureInfo
Dim Cults() As String = {"FR-FR", "EN-GB", "FR-CH"}
Dim I As Integer

Dim Amount As Decimal = 123.45
Dim Saldo As Decimal = 94.2

For I = 0 To Cults.GetUpperBound(0)

Cult = New CultureInfo(Cults(I))
Thread.CurrentThread.CurrentCulture = Cult
Console.WriteLine("Amount: {0:C}, Saldo: {1:C}", _
Amount, Saldo)
Cult = Nothing

Next

End Sub

End Module

то мы получим значения, специфические для той или иной страны, то есть включающие символ той или иной валюты: евро для Франции, фунты стерлингов для Великобритании и швейцарские франки для Швейцарии:

Форматирование типа Decimal

Этот тип форматирования указывается спецификатором D (или d). Помимо этого можно указать точность преобразования — минимальное число отображаемых цифр. Например, следующий код:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {"D", "D4", "D6"}
Dim I As Integer

Dim Value As Integer = 123

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: {0:" & Formats(I) & "}", Value)
Next

End Sub

End Module

выводит такие данные:

Форматирование типа Exponential

Мы используем этот формат (который также называется «инженерным» форматом; спецификатор E или e) для преобразования значений в экспоненциальное представление. Мы также можем указать точность преобразования — число символов после десятичной точки. Так, следующий код:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {"E", "E2", "E3"}
Dim I As Integer

Dim Value As Integer = 123456

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: {0:" & Formats(I) & "}", Value)
Next

End Sub

End Module

выводит следующие данные:

Dim Formats() As String = {"e", "e2", "e3"}

что приведет к следующему результату:

Форматирование типа Fixed-point

Форматирование чисел с фиксированной точкой (спецификатор F или f) используется для преобразования десятичных чисел путем добавления указанного числа нулей (по умолчанию два) после десятичной точки. В частности, код:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {"F", "F3", "F5"}
Dim I As Integer

Dim Value As Integer = 123

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: {0:" & Formats(I) & "}", Value)
Next

End Sub

End Module

выводит такие данные:

Форматирование типа General

Этот тип форматирования (спецификатор G или g) используется для преобразования значения либо в формат с фиксированной точкой, либо в «научный» формат. Максимальная точность для типа Double — 17, а точность по умолчанию — 15. Точность можно указывать вместе со спецификатором. Например, код:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {"G", "G3", "G17"}
Dim I As Integer

Dim Value As Double = 123456789123456789

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: {0:" & Formats(I) & "}", Value)
Next

End Sub

End Module

выводит следующие данные:

Форматирование типа Number

Данный формат (спецификатор N или n) используется для преобразования значения в форму [-]d,ddd,ddd.dd. Следующий пример показывает, как выполняется это преобразование:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {"N", "N3", "N5"}
Dim I As Integer

Dim Value As Integer = 123456

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: {0:" & Formats(I) & "}", Value)
Next

End Sub

End Module


Форматирование типа Percent

Мы используем данный формат (спецификатор P или p) для представления числового значения в виде процента. Следующий пример демонстрирует применение этого типа форматирования:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {"P", "P3", "P5"}
Dim I As Integer

Dim Value As Decimal = 0.12345

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: {0:" & Formats(I) & "}", Value)
Next

End Sub

End Module


Форматирование типа Round-trip

Этот формат (спецификатор R или r) используется при необходимости гарантии того, что преобразованное число может быть преобразовано обратно в первоначальную величину.

Форматирование типа Hexadecimal

Данный формат (спецификатор X или x) применяется в тех случаях, когда необходимо шестнадцатеричное представление значения. Использование данного типа форматирования показано на следующем примере:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {"X", "X3", "X5"}
Dim I As Integer

Dim Value As Byte = 128

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: 0x{0:" & Formats(I) & "}", Value)
Next

Console.WriteLine()

End Sub

End Module


Форматирование типа Picture Numeric

Мы уже использовали шаблоны при рассмотрении различных спецификаторов форматов. Они имеют форму {0:xy}, где x — один из существующих спецификаторов, а y — указатель точности. Помимо простых шаблонов мы можем использовать и более комплексные. Некоторые из таких шаблонов показаны в следующем примере:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {" {0:0.##}", " {0:##.###}", _
"{0:%#.##}", "{0:##.##E+0}", "{0:{{##.##}}}", _
"{0:\###.##\#}"}

Dim I As Integer
Dim Value As Double = 1.23456

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: " & Formats(I), Value)
Next

End Sub

End Module


Мы можем использовать спецификаторы форматов G, F, D и X (или их эквиваленты в нижнем регистре) для преобразования имен членов перечислений в их строчные эквиваленты. Следующий пример показывает, как это сделать:

'---------------------------------------
' .NET Formatting Demo
'---------------------------------------

Imports System

Module Module1

Sub Main()
Dim Formats() As String = {"{0:G}", "{0:F}", "{0:D}", "{0:X}"}

Dim I As Integer
Dim Value As FileAttributes = FileAttributes.Directory

For I = 0 To Formats.GetUpperBound(0)
Console.WriteLine("Value: " & Formats(I), Value)
Next

End Sub

End Module


Примечание. В библиотеке классов Microsoft .NET Framework Library также поддерживаются различные опции форматирования значений даты и времени. Мы ознакомимся с ними в одной из наших следующих статей.

Заключение

В этой части статьи мы рассмотрели использование строк, классов System.String, System.Text. StringBuilder, а также рассказали об использовании различных спецификаторов форматирования.

Следующий этап в освоении библиотеки классов Microsoft .NET Framework Library — потоки, поддержка файловой системы и сетевые функции. Об этом мы поговорим в следующем номере.

За дополнительной информацией обращайтесь в компанию Interface Ltd.

Обсудить на форуме Microsoft

Рекомендовать страницу

INTERFACE Ltd.
Телефон/Факс: +7 (495) 925-0049
Отправить E-Mail
http://www.interface.ru
Rambler's Top100
Ваши замечания и предложения отправляйте редактору
По техническим вопросам обращайтесь к вебмастеру
Дата публикации: 15.12.02