Текст книги "Полное руководство. С# 4.0"
Автор книги: Герберт Шилдт
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 50 (всего у книги 58 страниц)
Обратите внимание на пустую строку между словами "суше" и "другой". Дело в том, что в исходной строке после слова "суше" следует запятая и пробел, как в под строке "суше, другой". Но запятая и пробел указаны в качестве разделителей. Поэтому при разделении данной строки между двумя разделителями (запятой и пробелом) оказывается пустая строка.
Существует ряд других форм метода Split(), принимающих параметр типа StringSplitOptions. Этот параметр определяет, являются ли пустые строки частью разделяемой в итоге строки. Ниже приведены все эти формы метода Split(). public string[] Split(params char[] separator,StringSplitOptions options) public string[] Split(string[] separator, StringSplitOptions options) public string[] Split(params char[] separator, int count, StringSplitOptions options) public string[] Split(string[] separator, int count, StringSplitOptions options)
В двух первых формах метода Split() вызывающая строка разделяется на части и возвращается массив, содержащий подстроки, полученные из вызывающей стро ки. Символы, разделяющие эти подстроки, передаются в массиве separator. Если массив separator пуст, то в качестве разделителя используется пробел. А в третьей и четвертой формах данного метода возвращается количество строк, ограничиваемое параметром count. Но во всех формах параметр options обозначает конкретный спо соб обработки пустых строк, которые образуются в том случае, если два разделителя оказываются рядом. В перечислении StringSplitOptions определяются только два значения: None и RemoveEmptyEntries. Если параметр options принимает значение None, то пустые строки включаются в конечный результат разделения исходной стро ки, как показано в предыдущем примере программы. А если параметр options при нимает значение RemoveEmptyEntries, то пустые строки исключаются из конечного результата разделения исходной строки.
Для того чтобы стали понятнее последствия исключения пустых строк, попробуем заменить в предыдущем примере программы строку кода string[] parts = str.Split(seps);
следующим фрагментом кода. string[] parts = str.Split(seps, StringSplitOptions.RemoveEmptyEntries);
При выполнении данной программы получится следующий результат. Результат разделения строки: Один на суше другой на море Результат соединения строки: Один | на | суше | другой | на | море
Как видите, пустая строка, появлявшаяся ранее из-за того, что после слова "суше" следовали запятая и пробел, теперь исключена.
Разделение является очень важной процедурой обработки строк, поскольку с его помощью нередко получают отдельные лексемы, составляющие исходную строку. Так, в программе ведения базы данных может возникнуть потребность разделить с помо щью метода Split() строку запроса "показать все остатки больше 100" на отдель ные части, включая подстроки "показать" и "100". В процессе разделения исключа ются разделители, поэтому в итоге получается подстрока "показать" (без начальных и конечных пробелов), а не подстрока "показать". Этот принцип демонстрируется в приведенном ниже примере программы, где строки, содержащие такие бинарные математические операции, как 10 + 5, преобразуются в лексемы, а затем эти операции выполняются и выводится конечный результат. // Преобразовать строки в лексемы. using System; class TokenizeDemo { static void Main() { string[] input = { "100 + 19", "100 / 3,3", "-3 * 9", "100 – 87" }; char[] seps = {' '}; for(int i=0; i < input.Length; i++) { // разделить строку на части string[] parts = input[i].Split(seps); Console.Write("Команда: "); for(int j=0; j < parts.Length; j++) Console.Write(parts[j] + " "); Console.Write(", результат: "); double n = Double.Parse(parts[0]); double n2 = Double.Parse(parts[2]); switch(parts[1]) { case "+": Console.WriteLine(n + n2); break; case Console.WriteLine(n – n2); break; case "*": Console.WriteLine(n * n2); break; case "/": Console.WriteLine(n / n2); break; } } } }
Вот к какому результату приводит выполнение этой программы. Команда: 100 + 19 , результат: 119 Команда: 100 / 3,3 , результат: 30,3030303030303 Команда: -3 * 9 , результат: -27 Команда: 100 – 87 , результат: 13
Начиная с версии 4.0, в среде .NET Framework стали доступными следующие до полнительные формы метода Join(). public static string Join(string separator, params object[] values) public static string Join(string separator, IEnumerable
В первой форме рассматриваемого здесь метода возвращается строка, содержащая строковое представление объектов из массива values. Во второй форме возвращается строка, содержащая результат сцепления коллекции строк, обозначаемой параметром values. И в третьей форме возвращается строка, содержащая результат сцепления строковых представлений объектов из коллекции, обозначаемой параметром values. Во всех трех случаях каждая предыдущая строка отделяется от последующей раздели телем, определяемым параметром separator. Заполнение и обрезка строк
Иногда в строке требуется удалить начальные и конечные пробелы. Такая операция называется обрезкой и нередко требуется в командных процессорах. Например, про грамма ведения базы данных способна распознавать команду "print", но пользователь может ввести эту команду с одним иди несколькими начальными и конечными про белами. Поэтому перед распознаванием введенной команды необходимо удалить все подобные пробелы. С другой стороны, строку иногда требуется заполнить пробелами, чтобы она имела необходимую минимальную длину. Так, если подготавливается вы вод результатов в определенном формате, то каждая выводимая строка должна иметь определенную длину, чтобы сохранить выравнивание строк. Для упрощения подобных операций в C# предусмотрены соответствующие методы.
Для обрезки строк используется одна из приведенных ниже форм метода Trim(). public string Trim() public string Trim(params char[] trimChars)
В первой форме метода Trim() из вызывающей строки удаляются начальные и конечные пробелы. А во второй форме этого метода удаляются начальные и конечные вхождения в вызывающей строке символов из массива trimChars. В обеих формах возвращается получающаяся в итоге строка.
Строку можно заполнить символами слева или справа. Для заполнения строки сле ва служат такие формы метода PadLeft(). public string PadLeft(int totalWidth) public string PadLeft(int totalWidth, char paddingChar)
В первой форме метода PadLeft() вводятся пробелы с девой стороны вызывающей строки, чтобы ее общая длина стала равной значению параметра totalWidth. А во второй форме данного метода символы, обозначаемые параметром paddingChar, вво дятся с левой стороны вызывающей строки, чтобы ее общая длина стала равной зна чению параметра totalWidth. В обеих формах возвращается получающаяся в итоге строка. Если значение параметра totalWidth меньше длины вызывающей строки, то возвращается копия неизмененной вызывающей строки.
Для заполнения строки справа служат следующие формы метода 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 startIndex, string value)
где value обозначает строку, вставляемую в вызывающую строку по индексу startIndex. Метод возвращает получившуюся в итоге строку.
Для удаления части строки служит метод Remove(). Ниже приведены две его формы. public string Remove(int startIndex) public string Remove(int startIndex, int count)
В первой форме метода Remove() удаление выполняется, начиная с места, указы ваемого по индексу startIndex, и продолжается до конца строки. А во второй форме данного метода из строки удаляется количество символов, определяемое параметром count, начиная с места, указываемого по индексу startIndex. В обеих формах воз вращается получающаяся в итоге строка.
Для замены части строки служит метод 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(CultureInfo culture) public string ToUpper(CultureInfo culture)
С помощью этих форм можно избежать неоднозначности в исходном коде по от ношению к правилам смены регистра. Именно для таких целей эти формы и рекомен дуется применять.
Кроме того, имеются следующие методы ToUpperInvariant() и ToLowerInvariant(). public string ToUpperlnvariant() public string ToLowerlnvariant()
Эти методы аналогичны методам ToUpper() и ToLower(), за исключением того, что они изменяют регистр букв в вызывающей строке безотносительно к настройкам культурной среды. Применение метода Substring()
Для получения части строки служит метод Substring(). Ниже приведены две его формы. public string Substring(int startIndex) public string Substring(int startIndex, int length)
В первой форме метода Substring() подстрока извлекается, начиная с места, обозначаемого параметром startIndex, и до конца вызывающей строки. А во вто рой форме данного метода извлекается подстрока, состоящая из количества симво лов, определяемых параметром length, начиная с места, обозначаемого параметром startIndex. В обеих формах возвращается получающаяся в итоге подстрока.
В приведенном ниже примере программы демонстрируется применение метода 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# типов, например 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} указывает аргумент arg0, команда {1} – аргумент arg1 и т.д.
Если во время выполнения программы в форматирующей строке встречается команда форматирования, то вместо нее подставляется и затем отображается соот ветствующий аргумент, определяемый параметром argnum. Следовательно, от поло жения спецификатора формата в форматирующей строке зависит, где именно будут отображаться соответствующие данные. А номер аргумента определяет конкретный форматируемый аргумент.
Если в команде форматирования указывается параметр fmt, то данные отображают ся в указываемом формате. В противном случае используется формат, выбираемый по умолчанию. Если же в команде форматирования указывается параметр width, то вы водимые данные дополняются пробелами для достижения минимально необходимой ширины поля. При положительном значении параметра width выводимые данные вы равниваются по правому краю, а при отрицательном значении – по левому краю.
Оставшаяся часть данной главы посвящена вопросам форматирования и отдель ным спецификаторам формата. Спецификаторы формата числовых данных
Для числовых данных определено несколько спецификаторов формата, сведенных в табл. 22.4. Каждый спецификатор формата может включать в себя дополнительный, но необязательный спецификатор точности. Так, если числовое значение требуется указать в формате с фиксированной точкой и двумя десятичными разрядами в дроб ной части, то для этой цели служит спецификатор F2.
Таблица 22.4. Спецификаторы формата числовых данных Спецификатор Формат Назначение спецификатора точности С Денежная единица Задает количество десятичных разрядов с То же, что и С D Целочисленный (используется только с целыми числами) Задает минимальное количество цифр. При необходимости результат дополняется начальными нулями d То же, что и D Е Экспоненциальное представление чисел (в обозначении используется прописная буква Е) Задает количество десятичных разрядов. По умолчанию используется шесть разрядов е Экспоненциальное представление чисел (в обозначении используется строчная буква е) Задает количество десятичных разрядов. По умолчанию используется шесть разрядов F Представление чисел с фиксированной точкой Задает количество десятичных разрядов f То же, что и F G Используется более короткий из двух форматов: Е или F См. спецификаторы Е и F g Используется более короткий из двух форматов: е или f См. спецификаторы е и f N Представление чисел с фиксированной точкой (и запятой в качестве разделителя групп разрядов) Задает количество десятичных разрядов n То же, что и N Р Проценты Задает количество десятичных разрядов Р То же, что и Р R или 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:е}", 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(), относящемуся к одному из встроенных в С# числовых типов данных. Оба способа рассматриваются далее по порядку. Применение метода String.Format() для форматирования значений
Для получения отформатированного значения достаточно вызвать метод Format(), определенный в классе String, в соответствующей его форме. Все формы этого метода перечислены в табл. 22.5. Метод Format() аналогичен методу WriteLine(), за ис ключением того, что он возвращает отформатированную строку, а не выводит ее на консоль.
Таблица 22.5. Формы метода Format() Метод Описание public static string Format(string format, object arg0) Форматирует объект arg0 в соответствии с первой командой форматирования, которая содержится в строке format. Возвращает копию строки format, в которой команда форматирования заменена отформатированными данными public static string Format(string format, object arg0, object arg1) Форматирует объект arg0 в соответствии с первой командой форматирования, содержащейся в строке format, а объект arg1 – в соответствии со второй командой. Возвращает копию строки format, в которой команды форматирования заменены отформатированными данными public static string Format(string format, object arg0, object arg1, object arg2) Форматирует объекты arg0, arg1 и arg2 по соответствующим командам форматирования, содержащимся в строке format. Возвращает копию строки format, в которой команды форматирования заменены отформатированными данными public static string Format(string format, params object[] args) Форматирует значения, передаваемые в массиве args, в соответствии с командами форматирования, содержащимися в строке format. Возвращает копию строки format, в которой команды форматирования заменены отформатированными данными public static string Format(IFormatProvider provider, string format, 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); } } Определение пользовательского формата числовых данных
Несмотря на всю полезность предопределенных спецификаторов формата число вых данных, в C# предоставляется также возможность определить пользовательский, т.е. свой собственный, формат, используя средство, называемое форматом изображе ния. Своим происхождением термин формат изображения обязан тому обстоятельству, что специальный формат пользователь определяет, задавая пример внешнего вида (т.е. изображение) выводимых данных. Такой подход вкратце упоминался в части I этой книги, а здесь он рассматривается более подробно. Символы-заполнители специального формата числовых данных