此方法基于测量字符串渲染后的长度来补空格对齐,字体建议使用等宽字体.
using System;
using System.Drawing;
namespace Program
{
class Program
{
static void Main(string[] args)
{
PadString ps = new PadString();
Console.WriteLine($"{ps.PadRight("uid", 10)}{ps.PadRight("nickname", 40)}{"txt"}");
Console.WriteLine($"{ps.PadRight("用户id", 10)}{ps.PadRight("名字", 40)}{"文本"}");
}
}
class PadString
{
private Font Font;
private Graphics Graphics;
private StringFormat StringFormat;
private float SpaceWidth;
public string PadRight(string str, int totalWidth)
{
return str + new string(' ', PadSpaceCount(str, totalWidth));
}
public string PadLift(string str, int totalWidth)
{
return new string(' ', PadSpaceCount(str, totalWidth)) + str;
}
private float StringWidth(string str)
{
return Graphics.MeasureString(str, Font, int.MaxValue, StringFormat).Width;
}
private int PadSpaceCount(string str, int totalWidth)
{
double strWidth = Math.Round(StringWidth(str), 3);
double strTotalWidth = Math.Round(SpaceWidth * totalWidth, 3);
if ((totalWidth * SpaceWidth) <= strWidth)
{
return 0;
}
else
{
return (int)Math.Ceiling((strTotalWidth - strWidth) / SpaceWidth);
}
}
private PadString() { }
public PadString(string fontName = "黑体", int fontSize = 14)
{
Font = new Font(fontName, fontSize, FontStyle.Regular, GraphicsUnit.Pixel);
Graphics = Graphics.FromHwnd(IntPtr.Zero);
StringFormat = StringFormat.GenericTypographic;
StringFormat.FormatFlags = StringFormatFlags.FitBlackBox |
StringFormatFlags.LineLimit |
StringFormatFlags.MeasureTrailingSpaces |
StringFormatFlags.NoClip;
SpaceWidth = StringWidth(" ");
}
}
}