Строки форматирования .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.23456781,231,23
5.6789e105,68e+105,68E+10
9.87654e-69,88e-069,88E-06
1234567891,23e+081,23E+08

Строка форматирования "E"

Эта строка форматирования используется, если нужно представить число в экспоненциальном виде. При этом число после буквы "E" (или "e") означает число чисел после запятой перед экспонентой. "e" и "E" отличаются тем, что в первом случае знак экспоненты будет обозначен маленькой буквой e, а во второй заглавной E. Вот как будут отформатированы те же числа с этой строкой форматирования:

Исходное число"e""E3"
1.23456781,234568e+0001,235E+000
5.6789e105,678900e+0105,679E+010
9.87654e-69,876540e-0069,877E-006
1234567891,234568e+0081,235E+008

Строка форматирования "F"

Эта строка форматирования нужна для представления чисел в формате с фиксированной точкой. Число после буквы "F" обозначает количество чисел после точки (по умолчанию два числа).

Исходное число"f""F4"
1.23456781,231,2346
5.6789e1056789000000,0056789000000,0000
9.87654e-60,000,0000
123456789123456789,00123456789,0000

Обратите внимание на то, что осталось от маленького числа 9.87654e-6

Строка форматирования "N"

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

Исходное число"n""N4"
1.23456781,231,2346
5.6789e1056 789 000 000,0056 789 000 000,0000
9.87654e-60,000,0000
123456789123 456 789,00123 456 789,0000

Строка форматирования "R"

Эта строка форматирования может использоваться в том случае, если позже полученная строка будет преобразовываться обратно в число и при этом гарантируется, что после такой обратной операции Вы получите исходное число. Эту строку форматирования можно использовать только для дробных чисел, при попытке использовать ее при типе Int32, бросается исключение FormatException. При использовании этой строки форматирования число после буквы "r" значения не имеет. Так же не имеет значения то, писать эту букву заглавной или прописной.

Исходное число"r"
1.23456781,2345678
5.6789e1056789000000
9.87654e-69,87654E-06

Строка форматирования "X"

Эта строка форматирования нужна для представления целых чисел в 16-ричной форме. При попытке ее использовать на дробных числах, бросается исключение FormatException. При использовании заглавной буквы "X" буквы A - F в 16-ричном представлении будут заглавными, а при использовании прописной "x" - прописные.

Исходное число"x""X"
12345678975bcd1575BCD15

Форматирование с использованием метода 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.
4.5 stars

Рейтинг 4.3/5. Всего 21 голос(а, ов)



 01.11.2010 - 15:28

А можно посмотреть пример кода по выводу ну например даты

Сергей 01.11.2010 - 15:29

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

Может кто покажет пример кода по выводу ну например даты?

 03.12.2010 - 22:39

Console.WriteLine(String.Format("{0:d}", DateTime.Now));

 03.12.2010 - 22:44

Вот еще пример с часами, непонятно, что там у автора не получалось:
Console.WriteLine(String.Format("{0:HH.mm}", DateTime.Now));


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 914
 

Сергеич 11.06.2010 - 17:26

количество часов

Странно, что исключение выбрасывается.
Проверил, на "hh" выводится количество часов в 12-часовом формате, на "HH" - в 24-часовом