Это работает:
class Item
{
public decimal Number { get; set; }
public override string ToString() => Number.ToString();
}
тогда позже:
var item = new Item() { Number = 12m };
Console.WriteLine($"Item: {item}");
отпечатки
Item: 12
Но то, что я действительно хочу сделать вместо этого, это:
Console.WriteLine($"Item: {item:C2}");
И как-то получить
Item: $12.00
Кто-нибудь знает, можно ли/как это сделать?
Спасибо!
Да, я хотел, чтобы код был кратким, а «Число» — это действительно деталь реализации в моем случае, которую я хотел скрыть. Обнародовать это было самым быстрым способом объяснить проблему, но в реальной жизни я хочу иметь возможность изменять базовую схему поддержки по мере необходимости.
Ссылка документы
$"{item:C2}"
эффективно вызывает item.ToString("C2", CultureInfo.CurrentCulture);
, поэтому вы можете реализовать IFormattable
(документы):
class Item : IFormattable
{
public decimal Number { get; set; }
public override string ToString() => Number.ToString();
// IFormattable's .ToString method:
public string ToString(string format, IFormatProvider formatProvider) => Number.ToString(format, formatProvider);
}
Теперь этот код будет работать:
Console.WriteLine($"Item: {item:C2}");
В этом случае он должен работать отлично, поскольку вы в основном проксируете тот же метод на decimal
, но если вы собираетесь делать что-то более сложное, вам, вероятно, следует прочитать документы, указанные выше, особенно раздел Примечания для исполнителей.
Большое спасибо, это именно то, что мне было нужно. Просто не мог понять, как правильно искать его в Интернете.
Это не относится к интерполяции строк, поскольку
Console.WriteLine($"Item: {item:C2}");
совпадает сConsole.WriteLine("Item: {0:C2}", item);
иConsole.WriteLine("Item: " + item.ToString("C2"));
(когда определена такая перегрузка). Кроме того, если вам нужныitem
Number
, отформатированные как валюта, вы можете запросить это конкретно:Console.WriteLine($"Item: {item.Number:C2}");