将下一个参数作为String.Format中的字段宽度

时间:2010-02-22 21:24:20

标签: c# .net string-formatting

在C#中,我有一个宽度,我想用于某些字符串,但直到运行时我才知道该宽度。我正在做这样的事情:

string.Format("{0, " + digits + "}", value)  // prints 123 as "  123"

是否有一个字符串格式化指令可以让我指定这个而不会像这样一起粉碎我自己的格式字符串?

我在MSDN上浏览了一会儿,我觉得我错过了关于格式字符串或其他内容的整章。

8 个答案:

答案 0 :(得分:7)

看看PadLeft

s = "123".PadLeft(5);  // Defaults to spaces
s = "123".PadLeft(5, '.');  // Pads with dots

答案 1 :(得分:2)

你可以做点什么

string test = valueString.PadLeft(10,' ');

甚至是sillier

string spaces = String.Concat(Enumerable.Repeat(" ", digits).ToArray());

答案 2 :(得分:2)

答案 3 :(得分:1)

其他人提到的功能可以使用,但是这个MSDN页面有一个更通用的格式化解决方案,可以在运行时更改:

Composite Formatting

他们举例说明你的例子。

编辑:我以为你试图解决在运行时编写格式字符串的一般情况。例如,如果没有内置的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);

答案 4 :(得分:0)

也许这对您的格式研究有所帮助:

Formatting Types
Composite Formatting

但是,我不认为你会做得比这更好,因为alignment参数必须是格式字符串的一部分,似乎不是由属性表示。

答案 5 :(得分:0)

可能过度杀伤,但只是为了说明封装格式规范的方法,并使用接受String.Format的{​​{1}}重载。

IFormatProvider

答案 6 :(得分:0)

我发布了一篇CodeProject文章,可能就是你想要的。

请参阅:A C# way for indirect width and style formatting.

基本上它是一个方法FormatEx,它的作用类似于String.Format,除了它允许间接对齐和formatString说明符。

FormatEx("{0,{1}:{2}}", value, width, formatString);

表示使用varArgs 2指定的formattingString代码,在varArgs 1指定的字段宽度中格式化varArgs 0的值。

编辑:在内部,它完成了许多其他人在答案中建议的内容。我刚刚包装了用于对齐和formatString的最终值的解析和确定。我还添加了一个“中心对齐”修改器。

-Jesse

答案 7 :(得分:0)

String有一个构造函数,可以创建一个重复n次给定字符的字符串。

https://msdn.microsoft.com/en-us/library/xsa4321w(v=vs.110).aspx

// prints 123 as "  123"
string.Format(new string(' ', digits) + "{0}", value)