В C# у меня есть ширина, которую я хочу использовать для некоторых строк, но я не буду знать той ширины до времени выполнения. Я делаю что-то вроде этого:
string.Format("{0, " + digits + "}", value) // prints 123 as " 123"
Существует ли строковая директива форматирования, которая позволяет мне указать это, не разбивая мою собственную строку формата вместе как это?
Я озирался на MSDN на некоторое время, и я чувствую, что пропускаю целую главу по строкам формата или чему-то.
Взгляните на PadLeft
:
s = "123".PadLeft(5); // Defaults to spaces
s = "123".PadLeft(5, '.'); // Pads with dots
вы можете сделать что-то вроде
string test = valueString.PadLeft(10,' ');
или даже глупее
string spaces = String.Concat(Enumerable.Repeat(" ", digits).ToArray());
Вы можете использовать методы PadLeft
и PadRight
:
http://msdn.microsoft.com/en-us/library/system.string.padleft%28VS.71%29.aspx
Возможно, это поможет в вашем исследовании форматирования:
Типы форматирования
Составное форматирование
Однако я не думаю, что вы » re будет намного лучше, чем это, поскольку параметр выравнивания должен быть частью строки формата и, похоже, не представлен свойством.
Функции, упомянутые другими, будут работать, но на этой странице MSDN есть более общее решение для форматирования, которое изменяется во время выполнения:
Они дают примеры, очень похожие на ваш.
Изменить: Я думал, вы пытаетесь решить общий случай создания строки формата во время выполнения. Например, если бы PadLeft () не был встроен, вы могли бы сделать это:
int myInt = 123;
int nColumnWidth = 10;
string fmt = string.Format("Price = |{{0,{0}}}|", nColumnWidth);
// now fmt = "Price = |{0,5}|"
string s = string.Format(fmt, myInt);
Вы даже можете сделать все это в одной строке, но это некрасиво:
string s = string.Format(
string.Format("Price = |{{0,{0}}}|", nColumnWidth),
myInt);
Возможно, это излишне, но просто для иллюстрации способа инкапсуляции спецификации формата и использования перегрузки String.Format
, которая принимает IFormatProvider
.
class Program
{
public static void Main(string[] args)
{
int digits = 7;
var format = new PaddedNumberFormatInfo(digits);
Console.WriteLine(String.Format(format, "{0}", 123));
}
}
class PaddedNumberFormatInfo : IFormatProvider, ICustomFormatter
{
public PaddedNumberFormatInfo(int digits)
{
this.DigitsCount = digits;
}
public int DigitsCount { get; set; }
// IFormatProvider Members
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
return null;
}
// ICustomFormatter Members
public string Format(string format, object arg, IFormatProvider provider)
{
return String.Format(
String.Concat("{0, ", this.DigitsCount, "}"), arg);
}
}