如何格式化汉字以使其适合列?

时间:2019-01-16 11:26:29

标签: c# string formatting cjk

我试图以面向列的方式打印一些信息。一切对于拉丁字符都适用,但是当打印中文字符时,列将停止对齐。我们来看一个例子:

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

正如人们所看到的,中文没有与列对齐。 重要说明:这只是问题的表现;它不会在控制台应用中使用。有人可以帮我吗?

3 个答案:

答案 0 :(得分:3)

您可以使用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; 

该解决方案需要使用填充参数(以像素为单位)和字体。

答案 1 :(得分:0)

我可以想象只有一种带有填充的通用解决方案。您必须使用等宽字体,并且两个字母的所有符号都必须具有相同的大小。实际上,PaddingRight函数只是将提供的符号数量添加到字符串中。但是显示的字符串大小也取决于字体。在使用等宽字体的情况下,它将起作用,在其他情况下,即使是对于拉丁符号,也不会起作用。在我看来,最好为要使用的每个特定输出解决问题,因为字符串itsefl对如何呈现它一无所知,而且不知道它不该知道。

答案 2 :(得分:-1)

我尝试了以下代码,因为我没有中文支持,因此无法对其进行测试。

var latinPresentation1 = "some text" ;
var latinPresentation2 = "some longer text";

Console.WriteLine(String.Format("{0,-30} {1,-10} ", latinPresentation1, "| " + 23));
Console.WriteLine(String.Format("{0,-30} {1,-10} ", latinPresentation2, "| " + 23));

Console.WriteLine("..............................................");

var chinesePresentation1 = "一些文字";
var chinesePresentation2 = "一些較長的文字";

Console.WriteLine(String.Format("{0,-30} {1,-10} ", chinesePresentation1, "| " + 23));
Console.WriteLine(String.Format("{0,-30} {1,-10} ", chinesePresentation2, "| " + 23));