Objective-C 如何让非等宽的数字和空格对齐
在printf中,我们可以通过格式字符串来对文字进行对齐输出,比如:
1 | printf( "%5d\n%5d" , 12, 345); |
在使用等宽字体的Console中,我们可以看到数字右对齐很完美,但是,上述方法一旦应用到用到了非等宽字体的环境里就没这么好看了。
如下所示,想要让这六个属性对齐输出:
因为数字的宽度和空格不一样,所以就会看到下面的文字向前有个缩进。
这里,我们用的格式是:
1 | @ "攻击: %-6d特攻: %-6d\n防御: %-6d特防: %-6d\n速度: %-6d生命: %-6d" |
那么用制表符 \t 可不可以呢?答案是否定的。
因为制表符是把定位符补足到一定倍数的宽度,如果两个字符串的长度差超过了这个单位,就会差一个制表符的宽度了。
那么,我们手动控制制表符的插入可以么?
可以,但是如果字符串长度变化比较大,就要做多重判断。
1 2 3 4 5 6 7 8 9 10 | _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半宽度,因此我们只要补足空格的宽度就行了。经过测试,使用如下配置最佳:
1 2 3 4 5 6 7 8 9 10 | _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]; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架