我试图以面向列的方式打印一些信息。一切对于拉丁字符都适用,但是当打印中文字符时,列将停止对齐。让我们考虑一个例子:
var latinPresentation1 = "some text".PadRight(30) + "| " + 23;
var latinPresentation2 = "some longer text".PadRight(30) + "| " + 23;
Console.WriteLine(latinPresentation1);
Console.WriteLine(latinPresentation2);
Console.WriteLine("..............................................");
var chinesePresentation1 = "一些文字".PadRight(30) + " | " + 23;
var chinesePresentation2 = "一些較長的文字".PadRight(30) + "| " + 23;
Console.WriteLine(chinesePresentation1);
Console.WriteLine(chinesePresentation2);
输出:
some text | 23
some longer text | 23
.................................................
一些文字 | 23
一些較長的文字 | 23
可以看到,中文未与列对齐。
重要说明:这只是问题的表现;它不会在控制台应用中使用。谁能帮我这个?
最佳答案
您可以使用System.Windows.Forms程序集中的TextRenderer.MeasureText方法来构建基于字符串宽度而不是字符数的输出文本。
这是util方法:
public static string FillWithSpaces(this string text, int width, Font font)
{
while (TextRenderer.MeasureText(text, font).Width < width)
{
text += ' ';
}
return text;
}
以及用法:
var font = new Font("Courier New", 10.0F);
var padding = 340;
var latinPresentation1 = "some text ".FillWithSpaces(padding, font) + "| 23";
var latinPresentation2 = "some longer text".FillWithSpaces(padding, font) + "| 23";
var chinesePresentation1 = "一些文字".FillWithSpaces(padding, font) + "| 23";
var chinesePresentation2 = "一些較長的文字".FillWithSpaces(padding, font) + "| 23";
var result = latinPresentation1 + Environment.NewLine +
latinPresentation2 + Environment.NewLine +
".............................................." + Environment.NewLine +
chinesePresentation1 + Environment.NewLine +
chinesePresentation2;
该解决方案需要使用填充参数(以px为单位)和字体。