【问题标题】:How can I pad an integer on the left with zeros?如何用零填充左侧的整数?
【发布时间】:2011-09-17 10:56:48
【问题描述】:

我有以下变量:

NSNumber *consumption = [dict objectForKey:@"con"];

返回 42。如何将此数字填充到左侧的 10 位数字,以零开头。输出应如下所示,

0000000042

或者如果是 420,

0000000420

【问题讨论】:

标签: objective-c ios cocoa-touch


【解决方案1】:
NSString *paddedStr = [NSString stringWithFormat:@"%010d", 42];

编辑:它是 C 风格的格式。 %nd 表示宽度至少为 n。因此,如果整数长度为 2 位,那么您将拥有长度为 3 的字符串(使用 %3d 时)。默认情况下,左侧的空白区域由空格填充。 %0nd(0 介于 % 和 n 之间)表示 0 用于填充而不是空格。这里n 是总长度。如果整数小于n 数字,则使用左填充。

【讨论】:

  • 如果我只填充 3 个字符,格式会不会是 %03d?
  • 请检查编辑。您也可以尝试各种长度和数字。
【解决方案2】:

Objective-C 方式,

NSNumberFormatter * numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[numberFormatter setPaddingPosition:NSNumberFormatterPadBeforePrefix];
[numberFormatter setPaddingCharacter:@"0"];
[numberFormatter setMinimumIntegerDigits:10];

NSNumber * number = [NSNumber numberWithInt:42];

NSString * theString = [numberFormatter stringFromNumber:number];

NSLog(@"%@", theString);

C 方式虽然更快。

【讨论】:

  • @George 我不知道清洁剂。 NSNumberFormatter 肯定更冗长,但我认为它更清楚地表明意图。 (在这种情况下,无论如何,sprintf 格式并不完全是火箭科学。)
  • 我从不关心 NSNumberFormatter 是否可以做到这一点。一直使用 C 风格(可能是因为我是 C 出身)。为 Obj-C 风格 +1。
  • @George 肯定更清洁,但正如丹尼尔所说,这个更清晰。但是对于这种微不足道的用例,C 方式是要走的路。
【解决方案3】:

您不能在 NSNumber 本身中。如果您从数字创建字符串或使用NSLog(),只需使用适当的格式,例如

NSLog(@"%010d", [consumption intValue]);

【讨论】:

    【解决方案4】:

    您可以使用NSNumberFormatter 进行几乎任何您想要的数字格式。在这种情况下,我认为您会想要使用 setFormatWidth:setPaddingCharacter: 函数。

    【讨论】:

      【解决方案5】:

      带变量num_digits

      NSString* format =[NSString stringWithFormat:@"%%0%zdzd", num_digits];
      NSString *theString = [NSString stringWithFormat:format, 42];
      

      【讨论】:

        【解决方案6】:

        例如用 5 位零填充其余部分:

        NSInteger someValue = 10;
        [NSString stringWithFormat:@"%05ld", someValue];
        

        当您只需要点后的 2 位数字时,浮点数等效于 .02f

        所以你有 0 = 用零填充,5 = 位数和类型。

        【讨论】:

          【解决方案7】:

          Swift 3 解决方案

          let x = 1078.1243
          let numFormatter = NumberFormatter()
          numFormatter.minimumFractionDigits = 1 // for float
          numFormatter.maximumFractionDigits = 1 // for float
          numFormatter.minimumIntegerDigits = 10 // how many digits do want before decimal
          numFormatter.paddingPosition = .beforePrefix
          numFormatter.paddingCharacter = "0"
          
          let s = numFormatter.string(from: NSNumber(floatLiteral: x))!
          

          输出

          “0000001078.1”

          【讨论】: