2016-01-20 92 views
0

我使用Console类打印某些有时包含Unicode字符的结果。使用String.PadRight的传统填充方法无法正常工作,因为某些Unicode字符在字符串中占用一个字符,但在屏幕上占用两个字符。这里是代码:使用Unicode字符的C#控制台字符串填充

 Console.Out.WriteLine("123".PadRight(10, '-')); 
     Console.Out.WriteLine("xxxxxx".PadRight(10, '-')); 
     Console.Out.WriteLine("你好".PadRight(10, '-')); 

在输出中,前两行结束在同一位置,而第三行是两个字符长。代码页是:936(ANSI/OEM - 简体中文GBK)。

所以我想知道是否有一种方法可以在打印到控制台屏幕时获得字符串的实际宽度。谢谢!

+0

你可以在不使用实际字符的情况下编写代码,使用'\ u0000'格式代替,在这个问题上,我的意思是? –

+2

这是一个字体问题,如果您没有关于用于这些字符(不在控制台中)的字体的知识(和控制),那么您确实没有办法做到这一点。 – poke

+0

@ LasseV.Karlsen在这里,我只想显示代码的功能。当然,我会避免直接写这种东西。 –

回答

2

您可以通过检查当前光标位置之后输出做你的填充,是这样的:

private static void WriteConsolePadded(string value, int length, char padValue) 
{ 
    Console.Write(value); 
    if (Console.CursorLeft < length) 
    { 
     Console.Write(new string(padValue, length - Console.CursorLeft)); 
    } 
    Console.WriteLine(); 
} 

(除,显然,把很多更多地考虑到更好地命名的方法和参数)

然后你必须:

WriteConsolePadded("123",10, '-'); 
WriteConsolePadded("xxxxxx",10, '-'); 
WriteConsolePadded("你好",10, '-'); 

(OT她的变体也可能是有意义的,比如在输出之前测量起始位置,而不是仅仅假设它始终位于最左边的位置)

+0

这正是我想要的。非常感谢! –