Objective-C 如何讓非等寬的數字和空格對齊


在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];

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM