Строки форматирования .NET
Введение
В .NET все объекты происходят от базового класса System.Object, который содержит метод ToString() для преобразования объекта в строку, но кроме этого метода, который не принимает никаких параметров, многие классы реализуют еще несколько перегруженных методов ToString(), один из которых принимает строку форматирования. Об этом методе, а точнее о тех самых строках форматирования, которые надо им передавать мы и поговорим.
Форматирование целых и дробных чисел
Чтобы иметь возможность выбирать формат представления чисел, надо вызывать перегруженный метод ToString(), в который передается параметр типа System.String, которая и описывает форматирование. Эта строка должна содержать букву, которая описывает формат, и может содержать цифру, значение которой зависит от формата представления (т.е. от предшествующей буквы). Буквы, описывающие форматирования, могут быть следующие:
- "G" (или "g", так же этой строке равносильна пустая строка "" и null) в качестве основного формата;
- "E" (или "e") для экспоненциального вида;
- "F" (или "f") для представления чисел с фиксированной точкой;
- "N" (или "n") для числового представления с отделением тысяч, миллионов и т.д. пробелами;
- "R" (или "r") для такого строкового представления, что при использовании обратно метод Parse() получим то же самое число;
- "X" (или "x") для 16-ричного представления чисел;
- "P" (или "p") для процентного представления;
- "C" (или "c") для представления чисел в денежном формате.
В качестве примеров, на которых будем показывать преобразования, возьмем следующие числа:
Double:
1.2345678
5.6789e10
9.87654e-6
Int32:
123456789
Строка форматирования "G"
Начнем с самой простой строки форматирования. Она представляет собой основное (General) форматирование. Цифра после буквы обозначает сколько цифр будет выведено до символа экспоненты (если он понадобится). "g" и "G" отличаются тем, что в первом случае знак экспоненты будет обозначен маленькой буквой e, а во второй заглавной E. Если числа, написанные выше, преобразовывать в строку с использованием параметра "G", то они будут выведены так же, как и написаны выше. Но если их преобразовать строкой, например, "G3", то вот что получим:
Исходное число | "g3" | "G3" |
1.2345678 | 1,23 | 1,23 |
5.6789e10 | 5,68e+10 | 5,68E+10 |
9.87654e-6 | 9,88e-06 | 9,88E-06 |
123456789 | 1,23e+08 | 1,23E+08 |
Строка форматирования "E"
Эта строка форматирования используется, если нужно представить число в экспоненциальном виде. При этом число после буквы "E" (или "e") означает число чисел после запятой перед экспонентой. "e" и "E" отличаются тем, что в первом случае знак экспоненты будет обозначен маленькой буквой e, а во второй заглавной E. Вот как будут отформатированы те же числа с этой строкой форматирования:
Исходное число | "e" | "E3" |
1.2345678 | 1,234568e+000 | 1,235E+000 |
5.6789e10 | 5,678900e+010 | 5,679E+010 |
9.87654e-6 | 9,876540e-006 | 9,877E-006 |
123456789 | 1,234568e+008 | 1,235E+008 |
Строка форматирования "F"
Эта строка форматирования нужна для представления чисел в формате с фиксированной точкой. Число после буквы "F" обозначает количество чисел после точки (по умолчанию два числа).
Исходное число | "f" | "F4" |
1.2345678 | 1,23 | 1,2346 |
5.6789e10 | 56789000000,00 | 56789000000,0000 |
9.87654e-6 | 0,00 | 0,0000 |
123456789 | 123456789,00 | 123456789,0000 |
Обратите внимание на то, что осталось от маленького числа 9.87654e-6
Строка форматирования "N"
При использовании этой строки форматирования тысячи, миллионы и т.д. будут отделены пробелами. Число после буквы "N" обозначает количество цифр после точки
Исходное число | "n" | "N4" |
1.2345678 | 1,23 | 1,2346 |
5.6789e10 | 56 789 000 000,00 | 56 789 000 000,0000 |
9.87654e-6 | 0,00 | 0,0000 |
123456789 | 123 456 789,00 | 123 456 789,0000 |
Строка форматирования "R"
Эта строка форматирования может использоваться в том случае, если позже полученная строка будет преобразовываться обратно в число и при этом гарантируется, что после такой обратной операции Вы получите исходное число. Эту строку форматирования можно использовать только для дробных чисел, при попытке использовать ее при типе Int32, бросается исключение FormatException. При использовании этой строки форматирования число после буквы "r" значения не имеет. Так же не имеет значения то, писать эту букву заглавной или прописной.
Исходное число | "r" |
1.2345678 | 1,2345678 |
5.6789e10 | 56789000000 |
9.87654e-6 | 9,87654E-06 |
Строка форматирования "X"
Эта строка форматирования нужна для представления целых чисел в 16-ричной форме. При попытке ее использовать на дробных числах, бросается исключение FormatException. При использовании заглавной буквы "X" буквы A - F в 16-ричном представлении будут заглавными, а при использовании прописной "x" - прописные.
Исходное число | "x" | "X" |
123456789 | 75bcd15 | 75BCD15 |
Форматирование с использованием метода String.Format
Метод String.Format удобно использовать, когда надо отформатировать сравнительно длинную строку с подстановками. Этот метод использует выражения, заключенные в фигурных скобках. Общий формат выражения выглядит как
{index[,alignment][:formatString]},
где index - номер переменной, который затем перечисляется в списке параметров, alignment - размер поля, которое отводится для этого числа, formatString - строка форматирования, аналогичная описанным выше (т.е. C, D, E, F, G, N или X). Таким образом могут быть записаны выражения вроде s = System.String ("Форматированное число: {0:G}", x), или s = System.String ("Форматированное число: {0:G3}", x), или s = System.String ("Форматированное число: {0,15:G3}", x). Примеры того как будет выглядеть результат показано в таблице:
Строка форматирования | Результат |
{0:G} или, что равнозначно просто {0} | Форматированное число: 1,2345678 |
{0:G3} | Форматированное число: 1,23 |
{0,15:G3} | Форматированное число: 1,23 |
Форматирование дат и времени
Класс DateTime в своем методе ToString предлагает огромное число возможных строк форматирования. Все их подробно описывать нет смысла, поэтому сведем их в таблицу. Здесь тоже стоит обращать внимание на регистр букв, т.к. от него может отличаться та часть даты или времени, которая выводится. В качестве примера будем выводить дату "16 февраля (пятница) 2007 года 19 ч. 50 мин. 22 с."
Строка форматирования | Краткое описание | Результат работы |
"G" (или просто date.ToString()) | Основной формат | 16.02.2007 19:50:22 |
"G" | Основной формат без вывода секунд | 16.02.2007 19:50 |
"d" | Дата в кратком формате | 16.02.2007 |
"D" | Дата в полном формате | 16 февраля 2007. |
"dd" | Число | 16 |
"ddd" | День недели в кратком формате | Пт |
"dddd" | День недели в фолном формате | Пятница |
"a" | 16 февраля 2007. 19:50 | |
"F" или "U" | 16 февраля 2007. 19:57:11 | |
"r" | Время по Гринвичу | Fri, 16 Feb 2007 19:50:22 GMT |
"u" | ??? | 2007-02-16 19:50:22Z |
"s" | ??? | 2007-02-16T19:50:22 |
"M" или "m" | Месяц и число в полном формате | февраля 16 |
"Y" или "y" | Месяц и год | Февраль 2007 г. |
"MM" | Месяц числом | 02 |
"MMM" | Месяц в кратком формате | фев |
"MMMM" | Месяц в полном формате | Февраль |
"mm" | минуты | 50 |
"yy" | Последние две цифры года | 07 |
"yyy" | Год полностью | 2007 |
"t" | Время без секунд | 19:50 |
"T" | Время с секундами | 19:50:22 |
"ss" | Секунды | 22 |
Интересно, что мне по крайней мере не удалось найти как можно вывести только количество часов. До здравому смыслу должно быть что-то вроде "h" или "hh", но на эти строки форматирования метод ToString() бросает исключение FormatException. Также перечисленные выше символы форматирования можно использовать вместе в одной строке, при этому значение их может меняться. Например, строка "dd.M" выводит 16.2 (день.месяц), хотя отдельно M выводит число и месяц в полном формате.
Ну вот пожалуй и все. Надеюсь, что это кому-нибудь понадобится :)
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.