Главная страница
Навигация по странице:

  • Вставка, удаление и замена

  • Спецификаторы формата для числовых данных

  • Спецификатор

  • Использование методов String.Format() и ToString() для форматирования данных

  • Использование метода String.Format() для форматирования значений

  • Метод

  • Использование метода ToString() для форматирования данных

  • Создание пользовательского числового формата

  • Использование символов-заполнителей

  • Заполнитель

  • Создание пользовательского формата даты и времени

  • Форматирование перечислений

  • Справочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией


    Скачать 5.05 Mb.
    НазваниеСправочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией
    АнкорC #.pdf
    Дата08.12.2017
    Размер5.05 Mb.
    Формат файлаpdf
    Имя файлаC #.pdf
    ТипСправочник
    #10795
    страница37 из 52
    1   ...   33   34   35   36   37   38   39   40   ...   52
    554
    Часть II. Библиотека C# удаляются, в результате получаем подстроку “отобразить” (без начальных или концевых пробелов), а не “ отобразить “. Эта концепция иллюстрируется следующей программой.
    Сначала она выделяет лексемы из строк, содержащих такие бинарные математические операции, как 10 + 5, а затем выполняет эти операции и возвращает результаты.
    // Извлечение лексем из строк. using System; class TokenizeDemo { public 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

    Глава 20. Строки и форматирование
    555
    Удаление символов и дополнение ими строк
    Иногда возникает необходимость удалить из строки начальные и концевые пробелы.
    Без этой операции, как правило, не обходится ни один командный процессор. Например, программа ведения базы данных способна распознать слово “print”. Но пользователь мог ввести эту команду с одним или несколькими начальными либо концевыми пробелами.
    Поэтому, прежде чем такая команда будет передана на распознание базой данных, из нее должны быть удалены “лишние” пробелы. И наоборот, возможны ситуации, когда строку нужно дополнить пробелами, чтобы она “доросла” до определенной минимальной длины.
    Например, при подготовке данных для форматированного вывода необходимо позаботиться о том, чтобы каждая выводимая строка имела определенную длину. К. счастью, в C# предусмотрены методы, которые позволяют легко выполнить эти операции.
    Чтобы удалить из строки начальные и концевые пробелы, используйте один из следующих вариантов метода
    Trim()
    : public string Trim() public string Trim(params char[]
    chrs
    )
    Первый формат метода предназначен для удаления начальных и концевых пробелов из вызывающей строки. Второй позволяет удалить начальные и концевые символы, заданные параметром
    chrs
    . В обоих случаях возвращается строка, содержащая результат этой операции.
    В C# предусмотрена возможность дополнить строку заданными символами справа либо слева. Для реализации “левостороннего” дополнения строки используйте один из следующих методов: public string PadLeft(int
    len
    ) public string PadLeft(int
    len
    , char
    ch
    )
    Первый формат метода предназначен для дополнения строки с левой стороны пробелами в таком количестве, чтобы общая длина вызывающей строки стала равной заданному значению
    len
    . Второй формат отличается от первого тем, что для дополнения строки вместо пробела используется символ, заданный параметром
    ch
    . В обоих случаях возвращается строка, содержащая результат этой операции.
    Для реализации “правостороннего” дополнения строки используйте один из следующих методов: public string PadRight(int
    len
    ) public string PadRight(int
    len
    , char
    ch
    )
    Первый формат метода дополняет строку с правой стороны пробелами в таком количестве, чтобы общая длина вызывающей строки стала равной заданному значению
    len
    . Второй формат отличается от первого тем, что для дополнения строки вместо пробела используется символ, заданный параметром
    ch
    . В обоих случаях возвращается строка, содержащая результат этой операции.
    Выполнение операций удаления символов и дополнения ими строк демонстрируется в следующей программе:
    // Демонстрация операций удаления символов
    //и дополнения ими строк. using System; class TrimPadDemo { public static void Main() { string str = "тест";
    Console.WriteLine("Исходная строка: " + str);

    556
    Часть II. Библиотека C#
    //
    Дополнение пробелами с левой стороны строки. 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 start, string str)
    Здесь параметром str задается строка, вставляемая в вызывающую. Позиция вставки
    (индекс) задается параметром start
    . Метод возвращает строку, содержащую результат этой операции.
    С помощью метода
    Remove()
    можно удалить заданную часть строки: public string Remove(int
    start
    , int
    count
    )
    Количество удаляемых символов задается параметром
    count
    . Позиция (индекс), с которой начинается удаление, задается параметром
    start
    . Метод возвращает строку, содержащую результат этой операции.
    С помощью метода
    Replace()
    можно заменить часть строки заданным символом либо строкой. Этот метод используется в двух форматах: public string Replace(char
    ch1
    , char
    ch2
    ) public string Replace(string
    str1
    , string
    str2
    )
    Первый формат метода позволяет заменить в вызывающей строке все вхождения символа c
    h
    1
    символом
    ch2
    . Второй служит для замены в вызывающей строке всех

    Глава 20. Строки и форматирование
    557 вхождений строки
    str1
    строкой
    str2
    . В обоих случаях возвращается строка, содержащая результат этой операции.
    Рассмотрим программу, в которой демонстрируется использование методов
    Insert()
    ,
    Remove()
    и
    Replace()
    :
    // Вставка, замена и удаление строк. using System; class InsRepRevDemo { public 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()
    — прописными. Оба метода возвращают строку, содержащую результат операции. Существуют также версии этих методов, которые позволяют задавать форматы данных, присущие конкретному естественному языку, диалекту или территориальному образованию.

    558
    Часть II. Библиотека C#
    Использование метода Substring()
    С помощью метода
    Substring()
    можно получить нужную часть строки.
    Возможны две формы использования этого метода: public string Substring(int
    idx
    ) public string Substring(int
    idx
    , int
    count
    )
    При использовании первой формы выделяемая подстрока начинается с элемента, заданного индексом
    idx
    , и продолжается до конца вызывающей строки. Вторая форма позволяет выделить подстроку, которая начинается с элемента, заданного индексом
    idx
    , и включает
    count
    символов. В обоих случаях возвращается выделенная подстрока.
    Использование метода
    Substring()
    демонстрируется в следующей программе:
    // Использование метода Substring(). using System; class SubstringDemo { public 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: ABCDEFGHIJKLMNOPQRSTUWXYZ str.Substring(15): PQRSTUVWXYZ str.Substring(0, 15): ABCDEFGHIJKLMNO
    Форматирование
    Если данные встроенного типа (например, int или double
    ) требуется представить в форме, удобной для восприятия человеком, необходимо создать их строковое представление. Несмотря на то что C# автоматически поддерживает стандартный формат для такого представления, у программиста есть возможность задать собственный формат.
    Например, как было показано в части I, числовые данные можно вывести в формате с указанием суммы в долларах и центах. Для числовых типов предусмотрен ряд методов форматирования данных, в том числе и методы
    Console.WriteLine()
    ,
    String.Format()
    и
    ToString()
    . Во всех этих трех методах используется один и тот же подход к форматированию, поэтому, научившись форматировать данные с помощью одного их них, вы сможете применить свои навыки и к остальным методам.

    Глава 20. Строки и форматирование
    559
    Общее представление о форматировании
    Форматирование реализуется двумя компонентами: спецификаторами и поставщиками (провайдерами) формата. Форма, которую принимает строковое представление форматируемого значения, определяется применяемым спецификатором формата. Другими словами, внешний вид этой формы зависит именно от спецификатора формата.
    Например, чтобы вывести числовое значение с использованием экспоненциального представления чисел (в виде мантиссы и порядка), необходимо использовать спецификатор формата
    Е
    Во многих случаях на точный формат значения может оказывать влияние территориальное образование или естественный язык, который используется в данной программе. Например, в США денежные суммы представляются в долларах, а в Европе — в евро. Для отображения языковых различий в C# используются поставщики формата.
    Поставщик формата определяет способ интерпретации спецификатора формата и создается посредством реализации интерфейса
    IFormatProvider
    . Поставщики формата заданы для встроенных числовых типов и многих других типов среды .NET Framework. Поскольку форматировать данные можно, не задавая поставщик формата, в этой книге они не рассматриваются.
    Для форматирования данных необходимо включить в вызов соответствующего метода желаемый спецификатор формата. Об использовании спецификаторов формата уже шла речь в главе 3, но здесь имеет смысл уделить им больше внимания. Несмотря на то что ниже мы рассматриваем спецификаторы формата применительно к методу
    WriteLine()
    , аналогичный подход следует распространить и на другие методы, которые поддерживает форматирование данных.
    Чтобы отформатировать данные с помощью метода
    WriteLine()
    , используйте следующую версию метода
    WriteLine()
    :
    WriteLine("
    строка_форматирования
    ",
    arg0
    ,
    arg1
    , ... ,
    argN
    );
    В этой версии метода
    WriteLine() передаваемые ему аргументы разделяются запятыми, а не знаками “
    +
    ”, Элемент
    строка_форматирования
    содержит две составляющих: “постоянную” и “переменную”. Постоянная составляющая представляет собой печатные символы, отображаемые “как есть”, а переменная состоит из команд форматирования.
    Общая форма записи команд форматирования имеет такой вид:
    {
    номер_аргумента
    ,
    ширина
    :
    формат
    )
    Здесь элемент
    номер_аргумента
    определяет порядковый номер отображаемого аргумента (начиная с нулевого). С помощью элемента
    ширина
    указывается минимальная ширина поля, а спецификатор формата задается элементом
    формат
    . Элементы
    ширина
    и
    формат
    указывать необязательно. Таким образом, в простейшей форме команда форматирования лишь означает, какой аргумент нужно отобразить. Следовательно, команда
    {0}
    означает
    arg0
    ,
    {1}
    означает
    arg1
    и т.д.
    Если при выполнении метода
    WriteLine()
    в строке форматирования встречается команда форматирования, вместо нее подставляется (и отображается) аргумент, соответствующий заданному элементу
    номер_аргумента
    . Таким образом, элементы
    номер_аргумента
    указывают позицию спецификации в строке форматирования, которая определяет, где именно должны быть отображены соответствующие данные.
    Если в строке форматирования присутствует элемент
    формат
    , то соответствующие данные отображаются с использованием заданного формата. В противном случае используется стандартный формат. При наличии элемента
    ширина
    выводимые данные дополняются пробелами, которые гарантируют, что поле, занимаемое выводимым значением, будет иметь минимальную ширину. Если значение
    ширина
    положительно,

    560
    Часть II. Библиотека C# выводимые данные выравниваются по правому краю, а если отрицательно, — то по левому.
    В следующих разделах принципы форматирования и спецификаторы формата рассматриваются более подробно.
    Спецификаторы формата для числовых данных
    Спецификаторы формата, определенные для числовых данных, описаны в табл. 20 3.
    Каждый спецификатор формата может включать необязательный спецификатор точности.
    Например, чтобы указать, что значение, представляемое в формате с плавающей точкой, должно иметь два десятичных разряда, используйте спецификатор
    F2
    ,
    Как упоминалось выше, точный результат применения конкретного спецификатора формата зависит от параметров локализации, связанных с конкретным естественным языком, диалектом или территориальным образованием. Например, спецификатор валюты,
    С, автоматически отображает значение в денежном формате, соответствующем выбранному параметру локализации. Для большинства пользователей стандартная информация локализации соответствует их местной специфике и языку общения. Таким образом, используя спецификаторы формата, можно не беспокоиться о контексте локализации, в котором будет выполняться та или иная программа.
    Рассмотрим программу, которая демонстрирует использование ряда спецификаторов формата для представления числовых данных:
    // Демонстрация использования различных
    // спецификаторов формата. using System; class FormatDemo { public 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 %

    Глава 20. Строки и форматирование
    561
    15 000000000021
    $189.99
    Обратите внимание на то, как в некоторых форматах спецификатор точности влияет на форматируемое значение.
    Таблица 20.3. Спецификаторы формата
    Спецификатор
    Формат
    Значение спецификатора точности
    C
    Денежный
    Задает количество десятичных разрядов c
    Аналогично С
    D
    Целочисленный (используется только с целыми числами)
    Минимальное количество цифр. При необходимости результат дополняется начальными нулями d
    Аналогично D
    E
    Экспоненциальное представление чисел (с использованием прописной буквы E)
    Задает количество десятичных разрядов.
    По умолчанию используется шесть e
    Экспоненциальное представление чисел (с использованием строчной буквы е)
    Задает количество десятичных разрядов.
    По умолчанию используется шесть
    F
    Представление чисел с фиксированной точкой
    Задает количество десятичных разрядов f
    Аналогично F
    G
    Используется более короткий из
    Е- либо F-форматов
    См. спецификаторы Е и F g
    Используется более короткий из е- либо f-форматов
    См. спецификаторы е и f
    N
    Представление чисел с фиксированной точкой (и запятой в качестве разделителя групп разрядов)
    Задает количество десятичных разрядов n
    Аналогично N
    P
    Процентный
    Задает количество десятичных разрядов p
    Аналогично P
    R или r
    Числовое значение, которое можно с помощью метода Parse() преобразовать в эквивалентную "внутреннюю" форму (Это так называемый формат "кругового преобразования*.)
    Не используется
    X
    Шестнадцатеричный (использует прописные буквы A-F)
    Минимальное количество цифр. При необходимости результат дополняется начальными кулями x
    Шестнадцатеричный (использует строчные буквы a-f)
    Минимальное количество цифр. При необходимости результат дополняется начальными нулями
    Использование методов String.Format()
    и ToString() для форматирования данных
    Несмотря на то что встраивание команд форматирования в метод
    WriteLine()
    — очень удобный способ вывода данных в сформатированном виде, иногда имеет смысл ограничиться созданием строки, которая будет содержать форматированные данные, но не отображать немедленно эту строку. Другими словами, в некоторых ситуациях

    562
    Часть II. Библиотека C# нужно сформатировать данные заранее, чтобы они были готовы к последующему выводу на любое заданное устройство. Эта возможность имеет особую ценность в такой GUI-среде, как Windows, в которой операции ввода-вывода редко выполняются в расчете на консоль.
    Получить строковое представление значения в форматированном виде можно двумя способами: с помощью метода
    String.Format()
    или передачей спецификатора формата методу
    ToString()
    Использование метода String.Format() для
    форматирования значений
    Форматированное значение можно получить в результате вызова одной из версий метода
    Format()
    , определенного в классе
    String
    (эти версии представлены в табл. 20.4).
    Работа метода
    Format()
    во многом подобна методу
    WriteLine()
    , за исключением того, что метод
    Format()
    возвращает форматированную строку, а не выводит ее на консоль.
    Таблица 20.4. Методы Format()
    Метод
    Описание
    public static string Format( string
    str
    , object
    v
    )
    Форматирует объект
    v
    в соответствии с первой командой форматирования, которая содержится в строке
    str
    Возвращает копию строки
    str
    , в которой команда форматирования заменена форматированными данными public static string Format( string
    str
    , object
    v1
    , object
    v2
    )
    Форматирует объект
    v1
    в соответствии с первой командой форматирования, содержащейся в строке
    str
    , а объект
    v2
    — в соответствии со второй. Возвращает копию строки
    str
    , в которой команды форматирования заменены форматированными данными public static string Format( string
    str
    , object
    v1
    , object
    v2
    , object
    v3
    )
    Форматирует объекты
    v1
    ,
    v2
    и
    v3
    согласно соответствующим командам форматирования, содержащимся в строке
    str
    . Возвращает копию строки
    str
    , в которой команды форматирования заменены форматированными данными public static string Format( string str, params object[]
    v
    )
    Форматирует значения, переданные в параметре
    v
    , в соответствии с командами форматирования, содержащимися в строке
    str
    . Возвращает копию строки
    str
    , в которой команды форматирования заменены форматированными данными public static string Format(
    IFormatProvider
    fmtprvdr
    , string
    str
    , params object[]
    v
    )
    Форматирует значения, переданные в параметре
    v
    , в соответствии с командами форматирования, содержащимися в строке
    str
    , и с использованием провайдера формата, заданного параметром
    fmtprvdr
    Возвращает копию строки
    str
    , в которой команды форматирования заменены форматированными данными
    Ниже приведена рассмотренная ранее программа, демонстрирующая возможности форматирования, но переписанная с использованием метода
    String.Format()
    Результаты выполнения новой версии совпадают с результатами предыдущей.
    // Использование метода String.Format() для
    // форматирования значений. using System; class FormatDemo { public static void Main() {

    Глава 20. Строки и форматирование
    563 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 { public 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);
    }
    }
    }

    564
    Часть II. Библиотека C#
    Результаты выполнения этой программы таковы:
    Сумма: 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()
    . Обратите также внимание на включение в строку форматирования обычного текста (Сумма: и Произведение:), который становится частью выводимой строки.
    Использование метода ToString() для форматирования данных
    Для получения форматированного нужным образом строкового представления, соответствующего значению встроенного числового типа (например,
    Int32
    или
    Double
    ), можно использовать метод
    ToString()
    : public string ToString(string
    fmt
    )
    Метод
    ToString()
    возвращает строковое представление вызывающего объекта в соответствии с заданным спецификатором формата, переданным в параметре
    fmt
    Например, следующая программа создает денежное представление значения
    188.99
    , используя спецификатор формата
    C
    : string str = 189.99.ToString("C");
    Обратите внимание на то, что спецификатор формата непосредственно передается методу
    ToString()
    . В отличие от методов
    WriteLine()
    или
    Format()
    , которые используют встроенные команды форматирования (вместе с номером аргумента и значением ширины поля), метод
    ToString()
    принимает только спецификатор формата.
    Вот как выглядит новая версия предыдущей программы форматирования, которая для форматирования строк использует метод
    ToString()
    . Результаты выполнения новой версии совпадают с результатами предыдущей.
    // Использование метода ToString() для
    // форматирования значений. using System; class ToStringDemo { public static void Main() { double v = 17688.65849; double v2 = 0.15; int x = 21;

    Глава 20. Строки и форматирование
    565 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# программист может определить собственный формат, используя средство, называемое форматом изображения (
    picture format
    ). Своим названием этот термин обязан тому факту, что программист создает формат на основе примера (т.е. изображения) того, как должен выглядеть выводимый результат. Этот способ форматирования упоминался в части
    I. Здесь же мы рассмотрим его более детально.
    Использование символов-заполнителей
    При создании пользовательского формата задается пример, или изображение того, как должны выглядеть данные. Для этого используются символы, приведенные в табл. 20.5.
    Таблица 20.5. Символы-заполнители, используемые для создания пользовательского формата
    Заполнитель
    Описание
    #
    Цифра
    Десятичная точка
    ,
    Разделитель групп разрядов
    %
    Процент
    0
    Используется для дополнения начальными и концевыми нулями

    566
    Часть II. Библиотека C#
    Окончание табл. 20.5
    Заполнитель
    Описание
    ;
    Отделяет разделы, которые описывают формат для положительных, отрицательных и нулевых значений e0 E+0 E-0
    Экспоненциальное представление чисел e0 e+0 е-0
    Символ “точка” указывает местоположение десятичной точки.
    Символ “
    #
    ” задает позицию цифры и может располагаться слева или справа от десятичной точки или без таковой. Если этот символ (один или несколько) находится справа от десятичной точки, он (они) означает количество отображаемых десятичных разрядов. При необходимости значение округляется. Если символ “
    #
    ” находится слева от десятичной точки, он указывает позиции цифр, относящиеся к целой части числа. При необходимости добавляются начальные нули. Если целая часть числа содержит больше цифр, чем в формате представлено символов “
    #
    ”, такая целая часть числа отображается полностью и ни в коем случае не усекается. Если десятичная точка отсутствует, наличие символа “
    #
    ” означает, что форматируемое значение будет округлено до целого числа.
    Нулевое значение (без указания дополнить его начальными или концевыми нулями) отображаться не будет. Это значит, что при использовании такого формата, как
    ##.##
    , ничего не будет отображено, если форматируемое значение равно нулю. Чтобы отобразить таки нулевое значение, используйте символ-заполнитель “
    0
    ”.
    Благодаря символу-заполнителю “
    0
    ” выводимое значение дополняется начальными или концевыми нулями, гарантирующими наличие минимального количества цифр, заданного строкой форматирования. Этот символ можно использовать как с правой, так и с левой стороны от десятичной точки. Например, при выполнении инструкции
    Console.WriteLine("{0:00##.#00}", 21.3); отображается такой результат:
    0021.300
    Если форматируемое значение содержит больше цифр, чем задано спецификатором форматирования, то его целая часть (расположенная слева от десятичной точки) будет отображена полностью, а дробная (справа от десятичной точки) округлена.
    При форматировании больших чисел можно заказать вставку разделителей групп разрядов, задав шаблон отображаемого значения в виде последовательности символов “
    #
    ” со вставленной в нее запятой. Например, при выполнении инструкции
    Console.WriteLine("{0:#,###.#)", 3421.3); отображается такой результат:
    3,421.3.
    Обратите здесь внимание на то, что нет необходимости вставлять символ “запятая” во все предполагаемые позиции. Задания в шаблоне лишь одной запятой уже вполне достаточно для вставки ее в значение после каждых трех цифр (начиная от десятичной точки) в левой части числа. Например, при выполнении инструкции
    Console.WriteLine("{0:#,###.#}", 8763421.3); отображается следующий результат:
    8,763,421.3.
    Символы “запятая” в строке форматирования имеют и еще одно значение. Если они стоят слева от десятичной точки (но рядом с ней), то действуют как масштабный

    Глава 20. Строки и форматирование
    567 множитель. Каждая запятая обеспечивает деление форматируемого значения на 1 000.
    Например, при выполнении инструкции
    Console.WriteLine(
    "Значение в тысячах: {0:#, ###, .#}", 8763421.3); отображается такой результат:
    Значение в тысячах: 8,763.4
    Как видно по результату, мы получили масштабированное значение, представленное в тысячах.
    Помимо символов-заполнителей пользовательский спецификатор формата может содержать и другие символы. Любые символы, отличные от заполнителей, без изменений отображаются в отформатированной строке, причем в соответствующих шаблону позициях.
    Например, при выполнении инструкции
    Console.WriteLine(
    "Топливная экономичность равна {0:##.# миль на галлон}",
    21.3); отображается такой результат:
    Топливная экономичность равна 21.3 миль на галлон
    При необходимости здесь можно также использовать такие управляющие последовательности, как
    \t или
    \n
    Символы-заполнители
    Е
    и е
    означают, что форматируемое значение должно быть отображено в экспоненциальном представлении (в виде мантиссы и порядка). После символа
    Е
    и е
    должен стоять хотя бы один символ “
    0
    ”. Количество символов “
    0
    ” означает число десятичных цифр, которые должны отображаться при выводе. Дробная часть округляется в соответствии с заданным форматом. Прописному написанию символа- заполнителя соответствует отображение прописной буквы
    Е
    , а строчному — строчная (
    е
    ).
    Для гарантированного отображения знака порядка используйте формат
    E+
    или e+
    , а для отображения знака только в случае отрицательного порядка используйте один из таких форматов:
    Е
    , е
    ,
    Е- или е-
    Символ “
    ;
    ” представляет собой разделитель, который позволяет задать различные форматы для отображения положительных, отрицательных и нулевых значений. Общая форма записи спецификатора формата с использованием символа-заполнителя “
    ;
    ” такова:
    плюс-формат
    ;
    минус-формат
    ;
    нуль-формат
    Рассмотрим пример:
    Console.WriteLine("{0:#.##;(#.##);0.00}", num);
    Если значение num положительно, при выводе оно будет отображаться с двумя десятичными разрядами. Если num отрицательно, то при выводе оно будет отображено с двумя десятичными разрядами и заключено в круглые скобки. Если num равно нулю, отобразится строка
    0.00
    . При использовании символа-заполнителя “
    ;
    ” необязательно задавать все три части формата. Если важно указать, как должны выглядеть при выводе положительные и отрицательные значения, опустите элемент
    нуль-формат
    . Чтобы для отображения отрицательных значений использовать стандартный формат, опустите элемент
    минус-формат
    . В этом случае элементы
    плюс-формат
    и
    нуль-формат
    необходимо разделить двумя символами “точка с запятой”.
    В следующей программе демонстрируется использование лишь нескольких из многочисленных пользовательских форматов, которые может создать программист:
    // Использование пользовательских форматов. using System;

    568
    Часть II. Библиотека C# class PictureFormatDemo { public static void Main() { double num = 64354.2345;
    Console.WriteLine("Стандартный формат: " + num);
    //
    Отображаем значение с двумя десятичными разрядами.
    Console.WriteLine(
    "Значение с двумя десятичными разрядами: " +
    "{0:#.##}", num);
    //
    Отображаем значение с запятыми и
    // двумя десятичными разрядами.
    Console.WriteLine("Добавляем запятые: {0:#,###.##}", num);
    //
    Отображаем значение в
    // экспоненциальном представлении.
    Console.WriteLine(
    "Используем экспоненциальное представление: " +
    "{0:#.###е+00}", num);
    //
    Отображаем значение в тысячах.
    Console.WriteLine("Значение в тысячах: " + "{0:#0,}", num);
    /*
    Отображаем положительные, отрицательные и нулевые значения по-разному. */
    Console.WriteLine("Отображаем положительные, " +
    "отрицательные и нулевые " +
    "значения по-разному.");
    Console.WriteLine("{0:#.#;(#.##);0.00}", num); num = -num;
    Console.WriteLine("{0:#.##;(#.##);0.00}", num); num = 0.0;
    Console.WriteLine("{0:#.##;(#.##);0.00}", num);
    //
    Отображаем значение в процентах. num = 0.17;
    Console.WriteLine("Отображаем в процентах: {0:#%}", num);
    }
    }
    Результаты выполнения этой программы таковы:
    Стандартный формат: 64354.2345
    Значение с двумя десятичными разрядами: 64354.23
    Добавляем запятые: 64,354.23
    Используем экспоненциальное представление: 6.435е+04
    Значение в тысячах: 64
    Отображаем положительные, отрицательные и нулевые значения по- разному.
    64354.2
    (64354.23)
    0.00
    Отображаем в процентах: 17%

    Глава 20. Строки и форматирование
    569
    Форматирование даты и времени
    Форматирование часто применяется также к значениям такого типа данных, как
    DateTime
    . Как разъяснялось в главе 19, тип
    DateTime представляет дату и время.
    Значения даты и времени можно отобразить различными способами. Например:
    02/25/2002
    Monday, February 25, 2002 12:59:00 12:59:00 PM
    Неудивительно, что значения даты и времени имеют в разных странах различные представления. Поэтому в C# предусмотрена специальная подсистема форматирования значений этого типа.
    Форматирование значений даты и времени осуществляется с помощью соответствующих спецификаторов формата, которые приведены в табл. 20.6. Поскольку значения даты и времени могут меняться при изменении страны и языка общения, их представление зависит от параметров локализации, установленных для конкретного компьютера.
    Таблица 20.6. Спецификаторы формата для представления значений даты и времени
    Спецификатор
    Формат
    D
    Дата в длинной форме d
    Дата в краткой форме
    T
    Время в длинной форме t
    Время в краткой форме f
    Дата и время в длинной форме f
    Дата и время в краткой форме g
    Дата в краткой форме, а время — в длинной g
    Дата в краткой форме и время — в краткой
    M
    Месяц и день m
    Аналогично М
    R
    Дата и время в стандартной форме по Гринвичу r
    Аналогично R s
    Сортируемый формат представления даты и времени
    U
    Длинная форма универсального сортируемого формата представления даты и времени; время отображается как универсальное синхронизированное время (Universal Time Coordinated— UTC) u
    Краткая форма универсального сортируемого формата представления даты и времени
    Y
    Месяц и год y
    Аналогично Y
    Рассмотрим программу, которая демонстрирует использование спецификаторов формата, предназначенных для отображения значений даты и времени:
    // Форматирование значений даты и времени. using System; class TimeAndDateFormatDemo {

    570
    Часть II. Библиотека C# public static void Main() {
    DateTime dt = DateTime.Now; // Получаем текущее время.
    Console.WriteLine("Формат d: {0:d}", dt);
    Console.WriteLine("Формат D: {0:D}", dt);
    Console.WriteLine("Формат t: {0:t}", dt);
    Console.WriteLine("Формат Т: {0:T}", dt);
    Console.WriteLine("Формат f: {0:f}", dt);
    Console.WriteLine("Формат F: {0:F}", dt);
    Console.WriteLine("Формат g: {0:g}", dt);
    Console.WriteLine("Формат G: {0:G}", dt);
    Console.WriteLine("Формат m: {0:m}", dt);
    Console.WriteLine("Формат М: {0:M}", dt);
    Console.WriteLine("Формат r: {0:r}", dt);
    Console.WriteLine("Формат R: {0:R}", dt);
    Console.WriteLine("Формат s: {0:s}", dt);
    Console.WriteLine("Формат u: {0:u}", dt);
    Console.WriteLine("Формат U: {0:U}", dt);
    Console.WriteLine("Формат y: {0:y}", dt);
    Console.WriteLine("Формат Y: {0:Y}", dt);
    }
    }
    Результаты выполнения этой программы таковы:
    Формат d: 10.09.2003
    Формат D: 10 Сентябрь 2003 г.
    Формат t: 14:53
    Формат Т: 14:53:11
    Формат f: 10 Сентябрь 2003 г. 14:53
    Формат F: 10 Сентябрь 2003 г. 14:53:11
    Формат g: 10.09.2003 14:53
    Формат G: 10.09.2003 14:53:11
    Формат m: Сентябрь 10
    Формат М: Сентябрь 10
    Формат r: Wed, 10 Sep 2003 14:53:11 GMT
    Формат R: Wed, 10 Sep 2003 14:53:11 GMT
    Формат s: 2003-09-10T14:53:11
    Формат u: 2003-09-10 14:53:11Z
    Формат U: 10 Сентябрь 2003 г. 11:53:11
    Формат y: Сентябрь 2003 г.
    Формат Y: Сентябрь 2003 г.
    Следующая программа создает очень простые часы. Время обновляется каждую секунду. Начало каждого часа компьютер отмечает звуковым сигналом. Для получения (и вывода на экран) форматированного времени используется метод
    ToString()
    , определенный в классе
    DateTime
    . По достижении ровного часа к концу отформатированного времени добавляется символ звукового сигнала (

    ).
    // Простые часы. using System;

    Глава 20. Строки и форматирование
    571 class SimpleClock { public static void Main() { string t; int seconds;
    DateTime dt = DateTime.Now; seconds = dt.Second; for(;;)
    { dt
    =
    DateTime.Now;
    //
    Обновляем время при изменении значения
    // переменной seconds. if(seconds != dt.Second) { seconds
    = dt.Second; t
    = dt.ToString("T"); if(dt.Minute==0
    && dt.Second==0) t = t + "\a";
    // Обеспечиваем звуковой сигнал
    // в начале каждого часа.
    Console.WriteLine(t);
    }
    }
    }
    }
    Создание пользовательского формата даты и времени
    Несмотря на то что в большинстве случаев достаточно стандартных спецификаторов формата для отображения даты и времени, существует возможность создания собственных форматов. Этот процесс аналогичен созданию пользовательских форматов для числовых типов, которое было описано выше. По сути, программист просто создает пример
    (изображение) того, как должна выглядеть информация, содержащая дату и время. Для создания пользовательского формата отображения значений даты и времени используйте один или несколько символов-заполнителей, перечисленных в табл. 20.7.
    Изучив эту таблицу, вы увидите, что символы d
    , f
    , g
    , m
    ,
    M
    , s
    и t
    несут ту же функцию, что и спецификаторы формата для представления значений даты и времени, приведенные в табл. 20.6. Итак, если один из этих символов используется самостоятельно, он интерпретируется как спецификатор формата. В противном случае он рассматривается как заполнитель. Если же нужно использовать тот или иной символ самостоятельно, но без интерпретации его в качестве заполнителя, предварите его знаком процента (
    %
    ).
    Использование нескольких пользовательских форматов представления даты и времени демонстрируется в следующей программе:
    // Демонстрация пользовательских форматов представления
    // даты и времени. using System; class CustomTimeAndDateFormatsDemo { public static void Main() {
    DateTime dt = DateTime.Now;

    572
    Часть II. Библиотека C#
    Console.WriteLine("Время: {0:hh:mm tt}", dt);
    Console.WriteLine(
    "Время в 24-часовом исчислении: {0:HH:mm}", dt);
    Console.WriteLine("Дата: {0:ddd МММ dd, yyyy}", dt);
    Console.WriteLine("Эра: {0:gg}", dt);
    Console.WriteLine("Время с секундами: " +
    "{0:HH:mm:ss tt}", dt);
    Console.WriteLine("Используем m для дня месяца: {0:m}", dt);
    Console.WriteLine("Используем m для минут: {0:%m}", dt);
    }
    }
    Результаты выполнения программы таковы:
    Время: 11:14
    Время в 24-часовом исчислении: 11:14
    Дата: Чт сен 11, 2003
    Эра: A.D.
    Время с секундами: 11:14:52
    Используем m для дня месяца: Сентябрь 11
    Используем m для минут: 14
    Примечание: A.D. — сокр. от лат. anno Domini, т.е. нашей эры.
    Таблица 20.7. Символы-заполнители, используемые при создании пользовательских форматов даты и времени
    Заполнитель
    Значение
    d
    День месяца как число, лежащее в диапазоне 1-31 dd
    День месяца как число, лежащее в диапазоне 1-31. Значения из диапазона 1-
    9 дополняются начальный нулем ddd
    Сокращенное название дня недели dddd
    Полное название дня недели f, ff, fff, ffff, fffff, ffffff, fffffff
    Дробная часть значения секунд. Количество десятичных разрядов определяется числом заданных букв "f" g
    Эра h
    Часы в диапазоне 1-12 hh
    Часы в диапазоне 1-12. Значения из диапазона 1-9 дополняются начальным нулем
    H
    Часы в диапазоне 0-23
    HH
    Часы в диапазоне 0-23. Значения из диапазона 1-9 дополняются начальным нулем m
    Минуты mm
    Минуты. Значения из диапазона 1-9 дополняются начальным нулем
    M
    Месяц в виде числа из диапазона 1-12
    MM
    Месяц в виде числа из диапазона 1-12. Значения из диапазона 1-9 дополняются начальным кулем
    МММ
    Сокращенное название месяца
    MMMM
    Полное название месяца s
    Секунды

    Глава 20. Строки и форматирование
    573
    Окончание табл. 20 7
    Заполнитель
    Значение
    ss
    Секунды, Значения из диапазона 1-9 дополняются начальным нулем t
    Символ "А" или "P", означающий А М. (до полудня) или P.M. (после полудня), соответственно tt
    AM. или P.M. y
    Год в виде двух цифр, если недостаточно одной yy
    Год в виде двух цифр. Значения из диапазона 1-9 дополняются начальным нулем yyyy
    Год в виде четырех цифр z
    Смещение часового пояса в часах zz
    Смещение часового пояса в часах. Значения из диапазона 1-9 дополняются начальным нулем zzz
    Смещение часового пояса в часах и минутах
    :
    Разделитель для компонентов значения времени
    /
    Разделитель для компонентов значения даты
    % fmt
    Стандартный формат, соответствующий спецификатору формата fmt
    Форматирование перечислений
    Язык C# позволяет форматировать значения, определенные в перечислении. В общем случае значения перечислений можно отображать с использованием их имен или чисел.
    Спецификаторы формата, предназначенные для перечислений, приведены в табл. 20.8.
    Обратите внимание на форматы
    G
    и
    F
    . Перечисления, используемые для представления битовых полей, могут предваряться атрибутом
    Flags
    . Обычно битовые поля содержат значения, которые представляют отдельные биты и располагаются по степеням двойки. При наличии атрибута
    Flags спецификатор
    G
    отображает имена всех битовых составляющих заданного значения. Спецификатор
    F
    отображает имена всех битовых составляющих значения, если это значение можно построить, применив операцию ИЛИ к двум или более полям, определенным перечислением.
    Использование спецификаторов формата применительно к перечислениям демонстрируется в следующей программе:
    // Форматирование перечисления. using System; class EnumFmtDemo { enum Direction { Север, Юг, Восток, Запад }
    [Flags] enum Status { Готов=0x1, Автономный_режим=0x2,
    Ожидание=0x4, Данные_переданы=0x8,
    Данные_получены= 0x10,
    Системный_режим=0x20
    } public static void Main() {
    Direction d = Direction.Запад;
    Console.WriteLine("{0:G}", d);
    Console.WriteLine("{0:F}", d);
    Console.WriteLine("{0:D}", d);
    Console.WriteLine("{0:X}", d);

    574
    Часть II. Библиотека C#
    Status s = Status.Готов | Status.Данные_переданы;
    Console.WriteLine("{0:G}", s);
    Console.WriteLine("{0:F}", s);
    Console.WriteLine("{0:D}", s);
    Console.WriteLine("{0:X}", s);
    }
    }
    Результаты выполнения этой программы таковы:
    Запад
    Запад
    3 00000003
    Готов, Данные_переданы
    Готов, Данные_переданы
    9 00000009
    Таблица 20.8. Спецификаторы формата для перечислений
    Спецификатор
    Значение
    G
    Отображает имя значения. Если форматируемое перечисление предваряется атрибутом Fiags, спецификатор отображает имена всех битовых составляющих заданного значения (при условии, что оно допустимо) g
    Аналогично спецификатору G
    F
    Отображает имя значения. Если это значение можно создать, применив операцию ИЛИ к двум или более полям, определенным перечислением, спецификатор отображает имена всех битовых составляющих заданного значения, причем независимо от того, задан ли атрибут Flags f
    Аналогично спецификатору f
    D
    Отображает значение в виде десятичного целого числа d
    Аналогично спецификатору d
    X
    Отображает значение в виде шестнадцатеричного целого числа. Для гарантированного отображения восьми цифр значение при необходимости дополняется начальными нулями x
    Аналогично спецификатору X

    Полный справочник по
    1   ...   33   34   35   36   37   38   39   40   ...   52


    написать администратору сайта