在printf中,我們可以通過格式字符串來對文字進行對齊輸出,比如:
printf("%5d\n%5d", 12, 345);
在使用等寬字體的Console中,我們可以看到數字右對齊很完美,但是,上述方法一旦應用到用到了非等寬字體的環境里就沒這么好看了。
如下所示,想要讓這六個屬性對齊輸出:
因為數字的寬度和空格不一樣,所以就會看到下面的文字向前有個縮進。
這里,我們用的格式是:
@"攻擊: %-6d特攻: %-6d\n防御: %-6d特防: %-6d\n速度: %-6d生命: %-6d"
那么用制表符 \t 可不可以呢?答案是否定的。
因為制表符是把定位符補足到一定倍數的寬度,如果兩個字符串的長度差超過了這個單位,就會差一個制表符的寬度了。
那么,我們手動控制制表符的插入可以么?
可以,但是如果字符串長度變化比較大,就要做多重判斷。
_propertyLabel.text = [NSString stringWithFormat:@"攻擊: %d\t%c特攻: %d\n防御: %d\t%c特防: %d\n速度: %d\t%c生命: %d", pet.property.attack, pet.property.attack > 99 ? 0 : '\t', pet.property.special_attack, pet.property.defence, pet.property.defence > 99 ? 0 : '\t', pet.property.special_defence, pet.property.speed, pet.property.speed > 99 ? 0 : '\t', pet.property.hp];
那么,還有沒有別的辦法呢?我們希望讓上面的制表符的數量參數化,使得輸出方法更通用。參考 printf 的文檔,可以發現一種比較少見的寬度控制修飾符:*
這個修飾符的作用,是把%6d中的6參數化。通過實驗可以發現空格的寬度大概是數字的1半寬度,因此我們只要補足空格的寬度就行了。經過測試,使用如下配置最佳:
_propertyLabel.text = [NSString stringWithFormat:@"攻擊: %-*d特攻: %d\n防御: %-*d特防: %d\n速度: %-*d生命: %d", 12 - (int)log10(pet.property.attack), pet.property.attack, pet.property.special_attack, 12 - (int)log10(pet.property.defence), pet.property.defence, pet.property.special_defence, 12 - (int)log10(pet.property.speed), pet.property.speed, pet.property.hp];