355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Герберт Шилдт » C# 4.0: полное руководство » Текст книги (страница 64)
C# 4.0: полное руководство
  • Текст добавлен: 6 апреля 2017, 04:00

Текст книги "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() три аргумента отображаются не по порядку. Не следует забывать, что каких-то особых правил, предписывающих обозначать аргументы в спецификаторах формата в определенной последовательности, не существует. Любой спецификатор формата может обозначать какой угодно аргумент.


Применение методов String. Format() и ToString() для форматирования данных

Несмотря на все удобства встраивания команд форматирования выводимых данных в вызовы метода 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);

  }

}


    Ваша оценка произведения:

Популярные книги за неделю