Информационные системы
Строки в .Net
 


Информационные технологии

Технология .Net

Что такое .Net
.Net Framework
VB.Net: дорога в будущее
Типы данных VB.Net
Впечатление от VB.Net
Ссылки по Net

1. CLR - Введение
2. CLR - Часть 2
3. Visual Studio.Net
4. Библиотека классов
5. Массивы и коллекции
6. Строки
7. Файлы и каталоги
8. Потоки ввода-вывода

КомпьютерПресс



Инф. системы
Модель города
Книги и статьи

ЭРА

1С:Предприятие

Интересное

Форум

mista.ru / Инф. технологии / Технология .Net / Строки

Алексей Федоров
КомпьютерПресс
4'2002

Строки
Пространство имен System.Text
Форматирование
   Форматирование по умолчанию
   Форматирование типа Currency
   Форматирование типа Decimal
   Форматирование типа Exponential
   Форматирование типа Fixed-point
   Форматирование типа General
   Форматирование типа Number
   Форматирование типа Percent
   Форматирование типа Round-trip
   Форматирование типа Hexadecimal
   Форматирование типа Picture Numeric
Заключение

Мы продолжаем знакомство с Microsoft .NET Framework (см. КомпьютерПресс № 11-12’2001, 1-3’2002) и библиотекой классов .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, давайте кратко ознакомимся с другими методами, реализованными в данном классе:

  • Методы StartsWith(String) и EndWith(String) могут использоваться для проверки того, начинается ли и заканчивается ли данная строка указанной подстрокой. Например, следующий код:
    Str = “** Microsoft .NET Platform **”
    Console.WriteLine(Str.StartsWith(“**”) & “ “ & Str.EndsWith(“**”))

    возвращает true, true, так как в начале и в конце строки присутствуют указанные подстроки.

  • Для замены всех экземпляров указанного символа на другой символ мы используем метод Replace(Char, Char) или Replace(String, String), который возвращает результирующую строку. Для замены спецификаторов формата на их текстовые эквиваленты мы используем один из перегруженных методов Format. Например, следующий код:
    Str = “Microsoft .NET Platform”
    Console.WriteLine(Str.Replace(“ “, “_”))

    возвращает строку “Microsoft_.NET_Platform”.

    Следующий пример показывает использование метода Format:

    Str = “Amount to pay: {0:C}”
    Console.WriteLine(Str.Format(Str, 12.34))

    Результатом работы данного кода будет строка “Amount to pay: $12.34”.

  • Для объединения одной или более строк в одну строку используется один из перегруженных методов Concat. Например, в следующем фрагменте показано, как объединить в одну строку строки “Microsoft”, “.NET” и “Platform”:
    Dim Str1, Str2, Str3 As String
    Str1 = “Microsoft “
    Str2 = “.NET “
    Str3 = “Platform”
    Console.WriteLine(Str1.Concat(Str1, Str2, Str3))
  • Методы PadLeft(Integer, Char) и PadRight (Integer, Char) используются для заполнения строки слева или справа указанным числом символов. Например, следующий код:
    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*****”.
  • Методы TrimStart(Char()) и TrimEnd(Char()) служат для удаления заданной последовательности символов из начала или конца строки. Метод Trim() используется для удаления указанной последовательности символов как из начала, так и из конца строки.
  • Для удаления заданного числа символов из строки с указанной позиции служит метод Remove(Integer, Integer). В следующем примере показано, как превратить оригинальную строку в строку “Microsoft Platform”:
    Str = “Microsoft .NET Platform”
    Console.WriteLine(Str.Remove(Str.IndexOf(“.NET”), “.NET”.Length + 1))
  • Для того чтобы вставить строку в указанную позицию данной строки, мы используем метод Insert(Integer, String). Так, следующий пример показывает, как добавить строку “Platform” в конец оригинальной строки:
    Str = “Microsoft .NET”
    Console.WriteLine(Str.Insert(Str.Length, “ Platform”))
  • Для поиска подстроки в данной строке используется метод Substring(Integer, Integer). Например, следующий код возвращает строку “.NET”:
    Str = “Microsoft .NET Platform”
    Console.WriteLine(Str.Substring(Str.IndexOf(“.NET”), “.NET”.Length))

Отметим, что в приведенном выше примере мы использовали свойство 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:

  • Класс ASCIIEncoding представляет символы Unicode (U+0000 — U+007F) как 7-битные ASCII-символы.
  • Класс UnicodeEncoding представляет символы Unicode как двухбайтовые символы.
  • Класс UTF7Encoding представляет символы Unicode, используя 7-битную форму формата UCS Transformation Format. Поддерживаются все символы Unicode.
  • Класс UTF8Encoding представляет символы Unicode, используя 8-битную форму формата UCS Transformation Format. Поддерживаются все символы Unicode.

Все вышеперечисленные классы наследуют классу Encoding, который задает базовую функциональность этих классов.

  • Методы GetDecoder() и GetEncoder() возвращают объекты Decoder и Encoder для данного объекта Encoding. Объект Decoder используется для преобразования последовательности байтов в символы, а объект Encoder выполняет обратную операцию — преобразует последовательность символов в байты.
  • Свойство CodePage типа Integer содержит номер кодовой страницы для текущей кодировки.
  • Свойство ASCII типа Encoding возвращает кодировку для 7-битного набора ASCII-символов.
  • Свойство Default типа Encoding возвращает кодировку для текущей кодовой страницы ANSI.
  • Свойство Unicode типа Encoding возвращает кодировку для Unicode-формата, в котором байты расположены в порядке little-endian.
  • Свойство UTF7 типа Encoding возвращает кодировку для формата UTF7.
  • Свойство UTF8 типа Encoding возвращает кодировку для формата UTF8.
  • Методы GetByteCount(Char()) и GetCharCount(Byte()) используются для определения размера результата того или иного преобразования кодировок — они возвращают число результирующих байтов или символов соответственно.

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


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

Из рассказа о классе 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 — потоки, поддержка файловой системы и сетевые функции. Об этом мы поговорим в следующем номере.

© Станислав Митичкин
www.mista.ru
, 1997-2003
1C:TOP-100
Волшебный форум