C# Language
String.Format
Поиск…
Вступление
Методы Format
- это набор перегрузок в классе System.String
используется для создания строк, которые объединяют объекты в конкретные представления строк. Эта информация может быть применена к String.Format
, различным методам WriteLine
а также другим методам в .NET framework.
Синтаксис
- string.Format (строковый формат, params object [] args)
- string.Format (поставщик IFormatProvider, строковый формат, params object [] args)
- $ "string {text} blablabla" // Поскольку C # 6
параметры
параметр | подробности |
---|---|
формат | Строка составного формата , определяющая способ объединения аргументов в строку. |
арг | Последовательность объектов, которые должны быть объединены в строку. Поскольку это использует аргумент params , вы можете использовать список аргументов, разделенных запятыми, или фактический массив объектов. |
поставщик | Набор способов форматирования объектов для строк. Типичные значения включают CultureInfo.InvariantCulture и CultureInfo.CurrentCulture . |
замечания
Заметки:
-
String.Format()
обрабатываетnull
аргументы, неString.Format()
исключения. - Существуют перегрузки, которые заменяют параметр
args
одним, двумя или тремя параметрами объекта.
Места, где String.Format «встроен» в структуру
Есть несколько мест, где вы можете использовать String.Format
косвенно : секрет заключается в String.Format
перегрузки с string format, params object[] args
подписи string format, params object[] args
, например:
Console.WriteLine(String.Format("{0} - {1}", name, value));
Может быть заменен более короткой версией:
Console.WriteLine("{0} - {1}", name, value);
Существуют и другие методы, которые также используют String.Format
например:
Debug.WriteLine(); // and Print()
StringBuilder.AppendFormat();
Использование формата пользовательского номера
NumberFormatInfo
может использоваться для форматирования чисел integer и float.
// invariantResult is "1,234,567.89"
var invarianResult = string.Format(CultureInfo.InvariantCulture, "{0:#,###,##}", 1234567.89);
// NumberFormatInfo is one of classes that implement IFormatProvider
var customProvider = new NumberFormatInfo
{
NumberDecimalSeparator = "_NS_", // will be used instead of ','
NumberGroupSeparator = "_GS_", // will be used instead of '.'
};
// customResult is "1_GS_234_GS_567_NS_89"
var customResult = string.Format(customProvider, "{0:#,###.##}", 1234567.89);
Создание поставщика настраиваемого формата
public class CustomFormat : IFormatProvider, ICustomFormatter
{
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (!this.Equals(formatProvider))
{
return null;
}
if (format == "Reverse")
{
return String.Join("", arg.ToString().Reverse());
}
return arg.ToString();
}
public object GetFormat(Type formatType)
{
return formatType==typeof(ICustomFormatter) ? this:null;
}
}
Использование:
String.Format(new CustomFormat(), "-> {0:Reverse} <-", "Hello World");
Выход:
-> dlroW olleH <-
Выровнять влево / вправо, прокладка с пробелами
Второе значение в фигурных скобках определяет длину строки замены. При корректировке второго значения, которое должно быть положительным или отрицательным, выравнивание строки может быть изменено.
string.Format("LEFT: string: ->{0,-5}<- int: ->{1,-5}<-", "abc", 123);
string.Format("RIGHT: string: ->{0,5}<- int: ->{1,5}<-", "abc", 123);
Выход:
LEFT: string: ->abc <- int: ->123 <-
RIGHT: string: -> abc<- int: -> 123<-
Числовые форматы
// Integral types as hex
string.Format("Hexadecimal: byte2: {0:x2}; byte4: {0:X4}; char: {1:x2}", 123, (int)'A');
// Integers with thousand separators
string.Format("Integer, thousand sep.: {0:#,#}; fixed length: >{0,10:#,#}<", 1234567);
// Integer with leading zeroes
string.Format("Integer, leading zeroes: {0:00}; ", 1);
// Decimals
string.Format("Decimal, fixed precision: {0:0.000}; as percents: {0:0.00%}", 0.12);
Выход:
Hexadecimal: byte2: 7b; byte4: 007B; char: 41
Integer, thousand sep.: 1,234,567; fixed length: > 1,234,567<
Integer, leading zeroes: 01;
Decimal, fixed precision: 0.120; as percents: 12.00%
Форматирование валюты
Спецификатор формата «c» (или валюты) преобразует число в строку, представляющую сумму валюты.
string.Format("{0:c}", 112.236677) // $112.23 - defaults to system
точность
Значение по умолчанию - 2. Используйте c1, c2, c3 и т. Д. Для контроля точности.
string.Format("{0:C1}", 112.236677) //$112.2
string.Format("{0:C3}", 112.236677) //$112.237
string.Format("{0:C4}", 112.236677) //$112.2367
string.Format("{0:C9}", 112.236677) //$112.236677000
Символ валюты
-
CultureInfo
экземплярCultureInfo
для использования символа пользовательской культуры.
string.Format(new CultureInfo("en-US"), "{0:c}", 112.236677); //$112.24
string.Format(new CultureInfo("de-DE"), "{0:c}", 112.236677); //112,24 €
string.Format(new CultureInfo("hi-IN"), "{0:c}", 112.236677); //₹ 112.24
- Используйте любую строку в качестве символа валюты. Используйте
NumberFormatInfo
для настройки символа валюты.
NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;
nfi = (NumberFormatInfo) nfi.Clone();
nfi.CurrencySymbol = "?";
string.Format(nfi, "{0:C}", 112.236677); //?112.24
nfi.CurrencySymbol = "?%^&";
string.Format(nfi, "{0:C}", 112.236677); //?%^&112.24
Позиция валютного символа
Используйте CurrencyPositivePattern для положительных значений и CurrencyNegativePattern для отрицательных значений.
NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;
nfi.CurrencyPositivePattern = 0;
string.Format(nfi, "{0:C}", 112.236677); //$112.24 - default
nfi.CurrencyPositivePattern = 1;
string.Format(nfi, "{0:C}", 112.236677); //112.24$
nfi.CurrencyPositivePattern = 2;
string.Format(nfi, "{0:C}", 112.236677); //$ 112.24
nfi.CurrencyPositivePattern = 3;
string.Format(nfi, "{0:C}", 112.236677); //112.24 $
Отрицательное использование шаблона совпадает с положительным. Гораздо больше случаев использования см. В исходной ссылке.
Пользовательский десятичный разделитель
NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;
nfi.CurrencyPositivePattern = 0;
nfi.CurrencyDecimalSeparator = "..";
string.Format(nfi, "{0:C}", 112.236677); //$112..24
Поскольку C # 6.0
Начиная с C # 6.0, вместо String.Format
можно использовать интерполяцию String.Format
.
string name = "John";
string lastname = "Doe";
Console.WriteLine($"Hello {name} {lastname}!");
Привет, Джон Доу!
Дополнительные примеры для этого в разделе C # 6.0: String-интерполяция .
Выделение фигурных скобок внутри выражения String.Format ()
string outsidetext = "I am outside of bracket";
string.Format("{{I am in brackets!}} {0}", outsidetext);
//Outputs "{I am in brackets!} I am outside of bracket"
Форматирование даты
DateTime date = new DateTime(2016, 07, 06, 18, 30, 14);
// Format: year, month, day hours, minutes, seconds
Console.Write(String.Format("{0:dd}",date));
//Format by Culture info
String.Format(new System.Globalization.CultureInfo("mn-MN"),"{0:dddd}",date);
Console.Write($"{date:ddd}");
выход :
06
Лхагва
06
Тендерный | Имея в виду | Образец | Результат |
---|---|---|---|
d | Дата | {0:d} | 7/6/2016 |
дд | День, с нулевой | {0:dd} | 06 |
ддд | Короткое название дня | {0:ddd} | Мы бы |
дддд | Полное имя дня | {0:dddd} | среда |
D | Долгосрочная дата | {0:D} | Среда, 6 июля 2016 г. |
е | Полная дата и время, короткие | {0:f} | Среда, 6 июля 2016 года 18:30 |
Ф.Ф. | Вторая фракция, 2 цифры | {0:ff} | 20 |
FFF | Вторая фракция, 3 цифры | {0:fff} | 201 |
FFFF | Вторая фракция, 4 цифры | {0:ffff} | 2016 |
F | Полная дата и время, длинные | {0:F} | Среда, 6 июля 2016 года 6:30:14 |
г | Дата и время по умолчанию | {0:g} | 6/6/2016 18:30 |
гг | эпоха | {0:gg} | ОБЪЯВЛЕНИЕ |
чч | Час (2 цифры, 12H) | {0:hh} | 06 |
HH | Час (2 цифры, 24 часа) | {0:HH} | 18 |
M | Месяц и день | {0:M} | 6 июля |
мм | Минуты с нулевым запасом | {0:mm} | 30 |
М.М. | Месяц, с нулевым запасом | {0:MM} | 07 |
MMM | 3-месячное название месяца | {0:MMM} | июль |
MMMM | Полное название месяца | {0:MMMM} | июль |
сс | секунд | {0:ss} | 14 |
р | Дата RFC1123 | {0:r} | Ср, 06 июл 2016 18:30:14 GMT |
s | Строка сортируемой даты | {0:s} | 2016-07-06T18: 30: 14 |
T | Короткое время | {0:t} | 6:30 ВЕЧЕРА |
T | Много времени | {0:T} | 6:30:14 PM |
тт | ДО ПОЛУДНЯ ПОСЛЕ ПОЛУДНЯ | {0:tt} | ВЕЧЕРА |
U | Универсальное сортируемое местное время | {0:u} | 2016-07-06 18: 30: 14Z |
U | Универсальный GMT | {0:U} | Среда, 6 июля 2016 года 9:30:14 |
Y | Месяц и год | {0:Y} | Июль 2016 г. |
уу | 2-значный год | {0:yy} | 16 |
гггг | 4-значный год | {0:yyyy} | 2016 |
ZZ | Двузначное смещение часового пояса | {0:zz} | +09 |
ZZZ | полное смещение часового пояса | {0:zzz} | +09: 00 |
Нанизывать()
Метод ToString () присутствует во всех типах ссылочных объектов. Это происходит из-за того, что все ссылочные типы выводятся из Object, на котором есть метод ToString (). Метод ToString () в базовом классе объекта возвращает имя типа. Оставшийся фрагмент выведет «Пользователь» на консоль.
public class User
{
public string Name { get; set; }
public int Id { get; set; }
}
...
var user = new User {Name = "User1", Id = 5};
Console.WriteLine(user.ToString());
Тем не менее, пользователь класса может также переопределить ToString (), чтобы изменить возвращаемую строку. Ниже фрагмент кода выводит на консоль «Id: 5, Name: User1».
public class User
{
public string Name { get; set; }
public int Id { get; set; }
public override ToString()
{
return string.Format("Id: {0}, Name: {1}", Id, Name);
}
}
...
var user = new User {Name = "User1", Id = 5};
Console.WriteLine(user.ToString());
Связь с ToString ()
Хотя метод String.Format()
безусловно, полезен при форматировании данных в виде строк, он часто может быть немного перегружен, особенно при работе с одним объектом, как показано ниже:
String.Format("{0:C}", money); // yields "$42.00"
Более простым подходом может быть просто использование метода ToString()
доступного для всех объектов в C #. Он поддерживает все одинаковые стандартные и настраиваемые строки форматирования , но не требует необходимого сопоставления параметров, поскольку будет только один аргумент:
money.ToString("C"); // yields "$42.00"
Ограничения и форматирование ограничений
Хотя в некоторых сценариях этот подход может быть проще, подход ToString()
ограничен в отношении добавления левого или правого заполнения, как вы могли бы сделать в String.Format()
:
String.Format("{0,10:C}", money); // yields " $42.00"
Чтобы достичь такого же поведения с помощью метода ToString()
, вам нужно будет использовать другой метод, например PadLeft()
или PadRight()
:
money.ToString("C").PadLeft(10); // yields " $42.00"