有時候,我們在編寫代碼的時候,可能會碰到大段文本,需要将文本内容對齊的情況,比如左對齊和右對齊。對已知的文本内容,我們可以手動在每行文字前面和後面補空格,使其達到左對齊或者右對齊的效果,但是,如果文本内容長度是不固定的呢?此時,我們隻能通過代碼的方式來實作文本對齊了!
我們以李白的一首《将進酒》作為例子,要求是所有文字往右對齊,思路也很簡單,其實就是在文字前面補空格,達到對齊的目的,下面是我寫的代碼以及運作效果:
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,那麼如果使用該方法,預設使用半角空格進行文字補齊。
但是,這個方法僅限于文字是英文字母或者數字的情況下,因為中文和英文以及數字占得字元位置是不一樣的,一個中文占兩個字元位置,而一個英文或者數字占一個字元位置,而半角空格隻占一個字元位置,是以,使用第一個方法,如果文字中出現中文,就達不到我們的目的。
半角空格對齊并不能達到目的
是以,我們隻能使用第二個方法,第二個方法有兩個入參,除了totalWidth還有一個paddingChar,是一個char類型的參數,用來自定義補齊長度所使用的字元。
前面說了,一個半角空格隻占一個字元位置,此時想要達到我們的目的,我們需要使用兩個半角空格才能達到我們的目的。但是,很顯然這種方法不行,因為第二個方法參數類型是char類型,兩個半角空格的話,就是String類型了。
是以,我們可以使用全角空格,全角空格跟中文字元一樣,占兩個字元位置,最終效果如下:
運作效果
有PadLeft,自然就會有PadRight,使用方法和PadLeft差不多,隻不過是在文字右邊追加字元補齊文字長度罷了。
最後,我整點花活,将這首詩使用“*”号圍起來,使用的依然是PadLeft和PadRight!
邏輯部分代碼如下:
//擷取集合中長度最長的文本長度
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, '*'));
怎麼樣?學會了嗎?學會了就趕緊動手操作一下吧!