天天看點

C#如何使用代碼對齊文字?

作者:古耕
有時候,我們在編寫代碼的時候,可能會碰到大段文本,需要将文本内容對齊的情況,比如左對齊和右對齊。對已知的文本内容,我們可以手動在每行文字前面和後面補空格,使其達到左對齊或者右對齊的效果,但是,如果文本内容長度是不固定的呢?此時,我們隻能通過代碼的方式來實作文本對齊了!

我們以李白的一首《将進酒》作為例子,要求是所有文字往右對齊,思路也很簡單,其實就是在文字前面補空格,達到對齊的目的,下面是我寫的代碼以及運作效果:

var list = new List<string>()
{
      "君不見,黃河之水天上來,奔流到海不複回。",
      "君不見,高堂明鏡悲白發,朝如青絲暮成雪。",
      "人生得意須盡歡,莫使金樽空對月。",
      "天生我材必有用,千金散盡還複來。",
      "烹羊宰牛且為樂,會須一飲三百杯。",
      "岑夫子,丹丘生,将進酒,杯莫停。",
      "與君歌一曲,請君為我傾耳聽。",
      "鐘鼓馔玉不足貴,但願長醉不願醒。",
      "古來聖賢皆寂寞,惟有飲者留其名。",
      "陳王昔時宴平樂,鬥酒十千恣歡谑。",
      "主人何為言少錢,徑須沽取對君酌。",
      "五花馬,千金裘,呼兒将出換美酒,與爾同銷萬古愁。"
};
//擷取集合中長度最長的文本長度
var maxLength = list.Max(p=> p.Length);
list.ForEach(x =>
{
//使用PadLeft+全角空格對齊文本
Console.WriteLine(x.PadLeft(maxLength, ' '));
});           

可以看到,我使用的是String類型的PadLeft方法,這個方法有兩個方法重載,分别是PadLeft(int totalWidth)和PadLeft(int totalWidth, char paddingChar),如下所示:

[__DynamicallyInvokable]
public string PadLeft(int totalWidth)
{
		return PadHelper(totalWidth, ' ', isRightPadded: false);
}
[__DynamicallyInvokable]
public string PadLeft(int totalWidth, char paddingChar)
{
		return PadHelper(totalWidth, paddingChar, isRightPadded: false);
}           

其中,totalWidth代表需要補齊的文字參照總長度,這裡需要注意的是,這裡的長度代表字元數量,不是字元所占位數,一個文字占一個位置。

兩個方法重載很好解釋,就是當一行文字的字數低于totalWidth時,在文字左邊追加字元進行補齊。

第一個方法隻有一個參數,即totalWIdth,那麼如果使用該方法,預設使用半角空格進行文字補齊。

但是,這個方法僅限于文字是英文字母或者數字的情況下,因為中文和英文以及數字占得字元位置是不一樣的,一個中文占兩個字元位置,而一個英文或者數字占一個字元位置,而半角空格隻占一個字元位置,是以,使用第一個方法,如果文字中出現中文,就達不到我們的目的。

C#如何使用代碼對齊文字?

半角空格對齊并不能達到目的

是以,我們隻能使用第二個方法,第二個方法有兩個入參,除了totalWidth還有一個paddingChar,是一個char類型的參數,用來自定義補齊長度所使用的字元。

前面說了,一個半角空格隻占一個字元位置,此時想要達到我們的目的,我們需要使用兩個半角空格才能達到我們的目的。但是,很顯然這種方法不行,因為第二個方法參數類型是char類型,兩個半角空格的話,就是String類型了。

是以,我們可以使用全角空格,全角空格跟中文字元一樣,占兩個字元位置,最終效果如下:

C#如何使用代碼對齊文字?

運作效果

有PadLeft,自然就會有PadRight,使用方法和PadLeft差不多,隻不過是在文字右邊追加字元補齊文字長度罷了。

最後,我整點花活,将這首詩使用“*”号圍起來,使用的依然是PadLeft和PadRight!

C#如何使用代碼對齊文字?

邏輯部分代碼如下:

//擷取集合中長度最長的文本長度
var maxLength = list.Max(p=> p.Length);
//邊框長度 = 中文字元長度 * 2(中文占兩個位元組)+ 2(多出兩個*号)
var wLength = (maxLength * 2) + 2;
Console.WriteLine("".PadLeft(wLength,'*'));
list.ForEach(x =>
{
//使用PadLeft+全角空格對齊文本
Console.WriteLine(#34;*{x.PadLeft(maxLength, ' ')}*");
});
Console.WriteLine("".PadLeft(wLength, '*'));
           

怎麼樣?學會了嗎?學會了就趕緊動手操作一下吧!

繼續閱讀