【问题标题】:Padding a number in NSString在 NSString 中填充一个数字
【发布时间】:2011-10-27 04:49:31
【问题描述】:

我有一个 int,例如 45。我想从这个用 4 个零填充的 int 中获取 NSString。所以结果将是:@"0045"。类似的,如果int为9,我想得到:@"0009"

我知道我可以计算位数,然后从我想要填充的零中减去它,然后将该数字添加到字符串中,但是有更优雅的方法吗?谢谢。

【问题讨论】:

    标签: objective-c cocoa-touch cocoa nsstring


    【解决方案1】:

    试试这个:

    NSLog(@"%04d", 45);
    NSLog(@"%04d", 9);
    

    如果它有效,那么你可以得到填充数字

    NSString *paddedNumber = [NSString stringWithFormat:@"%04d", 45];
    NSString *otherPaddedNumber = [NSString stringWithFormat:@"%04d", 9];
    

    更新

    如果你想拥有任意数字,你必须为你的格式创建一个格式:

    // create "%04d" format string
    NSString *paddingFormat = [NSString stringWithFormat:@"%%0%dd", 4];
    
    // use it for padding numbers
    NSString *paddedNumber = [NSString stringWithFormat:paddingFormat, 45];
    NSString *otherPaddedNumber = [NSString stringWithFormat:paddingFormat, 9];
    

    更新 2

    请参阅@Ibmurai 关于如何使用 NSLog 正确填充数字的评论。

    【讨论】:

    • 感谢您的快速回复。这完美地工作,但我怎样才能指定一个任意数字?我试过: NSLog(@"%0%id",4, 45);但这不起作用。再次感谢。
    • 谢谢老兄!你救了我的命。
    • 为自己的格式创建格式是愚蠢的。只需使用 [NSString stringWithFormat:@"%0*d", 4, 45]。 *,要填充的长度,也指一个参数......所以 4 “替换”了星号。
    • @Ibmurai 现在你给出了最短的答案——这真的很傻。我的 printf-fu 很弱。)
    【解决方案2】:

    请原谅我用一个已被接受的答案来回答这个问题,但答案(在更新中)不是最好的解决方案。

    如果您想要一个任意数字,您不必必须为您的格式创建格式,因为IEEE printf 支持这一点。而是这样做:

    NSString *paddedNumber = [NSString stringWithFormat:@"%0*d", 4, 45];
    NSString *otherPaddedNumber = [NSString stringWithFormat:@"%0*d", 4, 9];
    

    虽然其他解决方案有效,但它的效果和优雅度较低。

    来自 IEEE printf 规范:

    字段宽度或精度或两者都可以用星号 ('*') 表示。在这种情况下,int 类型的参数提供字段宽度或精度。

    【讨论】:

      【解决方案3】:

      作为 Int 扩展的 Swift 版本(可能想为该方法起一个更好的名称):

      extension Int
      {
          func zeroPaddedStringValueForFieldWidth(fieldWidth: Int) -> String
          {
              return String(format: "%0*d", fieldWidth, self)
          }
      }
      

      例子:

      print( 45.zeroPaddedStringValueForFieldWidth(4) ) // prints "0045"
      print( 9.zeroPaddedStringValueForFieldWidth(4) ) // prints "0009"
      

      【讨论】: