СТАТЬЯ |
15.12.02
|
© Алексей Федоров
Статья была опубликована в журнале "КомпьютерПресс"
Мы продолжаем знакомство с 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 Module
Метод 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, давайте кратко ознакомимся с другими методами, реализованными в данном классе:
Dim Str1, Str2, Str3 As String
Str1 = “Microsoft “
Str2 = “.NET “
Str3 = “Platform”
Console.WriteLine(Str1.Concat(Str1, Str2, Str3))
Str = “Microsoft .NET Platform”
Console.WriteLine(Str.PadLeft(Str.Length + 5, “*”))
возвращает строку “*****Microsoft .NET Platform”, а код, приведенный ниже:
Str = “Microsoft .NET Platform”
Console.WriteLine(Str.PadRight(Str.Length + 5, “*”))
возвращает строку “Microsoft .NET Platform*****”.
Str = “Microsoft .NET Platform”
Console.WriteLine(Str.Remove(Str.IndexOf(“.NET”), “.NET”.Length + 1))
Str = “Microsoft .NET”
Console.WriteLine(Str.Insert(Str.Length, “ Platform”))
Str = “Microsoft .NET Platform”
Console.WriteLine(Str.Substring(Str.IndexOf(“.NET”), “.NET”.Length))
Отметим, что в приведенном выше примере мы использовали свойство Length класса String в строке, заданной литералом — это еще один способ использования класса String без создания экземпляра данного класса.
Пространство имен 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) или в любом другом формате, то нам нужны более мощные средства. И здесь нам на помощь приходят специальные спецификаторы форматов. Мы рассмотрим эти спецификаторы ниже.
Для форматирования значения как «денежного», мы используем спецификатор 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
то мы получим значения, специфические для той или иной страны, то есть включающие символ той или иной валюты: евро для Франции, фунты стерлингов для Великобритании и швейцарские франки для Швейцарии:
Этот тип форматирования указывается спецификатором 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
выводит такие данные:
Мы используем этот формат (который также называется «инженерным» форматом; спецификатор 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"}
что приведет к следующему результату:
Форматирование чисел с фиксированной точкой (спецификатор 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
выводит такие данные:
Этот тип форматирования (спецификатор 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
выводит следующие данные:
Данный формат (спецификатор 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
Мы используем данный формат (спецификатор 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
Этот формат (спецификатор R или r) используется при необходимости гарантии того, что преобразованное число может быть преобразовано обратно в первоначальную величину.
Данный формат (спецификатор 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
Мы уже использовали шаблоны при рассмотрении различных спецификаторов форматов. Они имеют форму {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.
INTERFACE Ltd. |
|