【问题标题】:Format text by adding whitespace通过添加空格来格式化文本
【发布时间】:2014-03-15 13:09:57
【问题描述】:

我正在尝试通过空格格式化字符串。 所有字符串通常看起来像

01. Anton 30p
02. Cinderella 20p
03. Thomas 18p
04. Anastacia-Laura 16p

我想格式化每个字符串,点从同一列开始。 我在那里写道:

s = stringUpToName;
int addSpacing = 37 - s.Length;
for (int i = 0; i < addSpacing; i += 1) s += " ";

s += points;

这样更接近了,但格式仍然不完美。

我希望它看起来像这样:

01. Anton            30p
02. Cinderella       20p
03. Thomas           18p
04. Anastacia-Laura  16p

【问题讨论】:

标签: c# string


【解决方案1】:

使用"0" custom specifier 作为零占位符来格式化索引/记录数。 0:00 会给你01 的价值1

还请记住,item format syntax{ index[,alignment][:formatString]},其中对齐表示首选的格式化字段宽度。因此,将对齐添加到第二个项目格式{1,20} 会为您提供 20 个字符的右对齐字段宽度。带有负对齐的字段将左对齐。

总格式字符串看起来像"{0:00}. {1,-20}{2}p"

如果您正在构建字符串,您可以将其与String.FormatStringBuilder.AppendFormat 一起使用,或者如果您将其写入控制台,则可以使用Console.WriteLine

int index = 1;
string name = "Anton";
int points = 30;
var result = String.Format("{0:00}. {1,-20}{2}p", index, name, points)
// "01. Anton               30p"

【讨论】:

  • 你能解释一下吗?
  • 我刚刚测试了这个:错误的输出。
  • @Saphire 抱歉,左对齐字段需要负对齐。更新
【解决方案2】:

String.Format 和 Composite Formatting 使用对齐功能

string[] names = new string[]
{
    "1. Anton 30p",
    "2. Cinderella 20p",
    "3. Thomas 18p",
    "4. Anastacia-Laura 16p"
};

foreach(string s in names)
{
    int lastSpace = s.LastIndexOf(' ');
    int firstSpace = s.IndexOf(' ');
    string result = string.Format("{0,-4}{1,-37}{2,4}", s.Substring(0, firstSpace), s.Substring(firstSpace + 1, lastSpace), s.Substring(lastSpace+1));
    Console.WriteLine(result);

}

请记住,要查看在列中精确对齐的输出,您需要使用固定宽度字体,例如 Lucida Console 或 Courier,因为可变宽度字体打印 I 时使用的像素比打印 W 时要少。

【讨论】:

    【解决方案3】:

    尝试使用右对齐数字

    String.Format("{0} {1} {2,4}p", 号码, 姓名, 点);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多