• Objective-C 如何让非等宽的数字和空格对齐


    在printf中,我们可以通过格式字符串来对文字进行对齐输出,比如:

    printf("%5d
    %5d", 12, 345);
    

    在使用等宽字体的Console中,我们可以看到数字右对齐很完美,但是,上述方法一旦应用到用到了非等宽字体的环境里就没这么好看了。

    如下所示,想要让这六个属性对齐输出:

    因为数字的宽度和空格不一样,所以就会看到下面的文字向前有个缩进。

    这里,我们用的格式是:

    @"攻击: %-6d特攻: %-6d
    防御: %-6d特防: %-6d
    速度: %-6d生命: %-6d"
    

    那么用制表符 可不可以呢?答案是否定的。

    因为制表符是把定位符补足到一定倍数的宽度,如果两个字符串的长度差超过了这个单位,就会差一个制表符的宽度了。

    那么,我们手动控制制表符的插入可以么?

    可以,但是如果字符串长度变化比较大,就要做多重判断。

    _propertyLabel.text = [NSString stringWithFormat:@"攻击: %d	%c特攻: %d
    防御: %d	%c特防: %d
    速度: %d	%c生命: %d",
                               pet.property.attack,
                               pet.property.attack > 99 ? 0 : '	',
                               pet.property.special_attack,
                               pet.property.defence,
                               pet.property.defence > 99 ? 0 : '	',
                               pet.property.special_defence,
                               pet.property.speed,
                               pet.property.speed > 99 ? 0 : '	',
                               pet.property.hp];
    

      

    那么,还有没有别的办法呢?我们希望让上面的制表符的数量参数化,使得输出方法更通用。参考 printf 的文档,可以发现一种比较少见的宽度控制修饰符:*

    这个修饰符的作用,是把%6d中的6参数化。通过实验可以发现空格的宽度大概是数字的1半宽度,因此我们只要补足空格的宽度就行了。经过测试,使用如下配置最佳:

    _propertyLabel.text = [NSString stringWithFormat:@"攻击: %-*d特攻: %d
    防御: %-*d特防: %d
    速度: %-*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];

  • 相关阅读:
    大数据是否有可能有效配置资源?
    在大数据时代,我们需要数据售货员
    在大数据时代,我们需要数据售货员
    粗糙的贝叶斯转化概率预测模型
    粗糙的贝叶斯转化概率预测模型
    MVC中的ViewData、ViewBag和TempData
    58被微信玩弄,你知道吗?
    你的以太网速度足够快吗?四种更快的速度正在路上······
    hibernate预编译SQL语句中的setParameter和setParameterList
    创建单线性链表的不同表示方法和操作
  • 原文地址:https://www.cnblogs.com/dabaopku/p/3419585.html
Copyright © 2020-2023  润新知