2011-11-03 304 views

回答

6

按照specification

各转换规范由 '%' 字符引入,或者通过字符序列“ %n $“,之后按顺序出现:

  • 零个或多个标志(以任何顺序),其中的修改y转换规范的含义。

  • 可选的最小字段宽度。如果转换后的值的字节数少于字段宽度,则默认在左侧填充空格;如果下面描述的左调整标记(' - ')被赋予字段宽度,它应该被填充在右边。字段宽度采用星号('*')(如下所述)或十进制整数。

  • 可选精度,给出d,i,o,u,x和X转换说明符的最小位数;在a,e,E,f和F转换说明符的基数字符之后出现的数字位数; g和G转换说明符的最大有效位数;或从s [XSI] [Option Start]和S [Option End]转换说明符中的字符串打印的最大字节数。精度采用句点('。')的形式,后面跟着一个星号('*'),如下所述,或者一个可选的十进制数字字符串,其中空数字字符串被视为零。如果精度与任何其他转换说明符一起出现,则行为未定义。

  • 一个可选的长度修饰符,用于指定参数的大小。

  • 指示要应用的转换类型的转换说明符字符。

我们正在使用的第一类型的转换,因为有一个在这里没有美元符号。请注意上面列表顶部的字样,顺序为@是一个转换说明符字符(如提到here),它表示我们应该访问作为NSObject传入的值并阅读其description属性。由于我们已经达到最后一个要点,格式代码实际上在@符号后结束,正如@Kevin Ballard指出的那样,-1被解析为文字文本。

6

这只是打印“NUM-1”(其中NUM是数字)。举个例子,如果数字是5,那么将打印“5-1”。

使用格式字符串时,格式标记的任何修饰符都必须出现在格式类型说明符之前。在这种情况下,这意味着%@令牌的任何修饰符都必须出现在%@之间(尽管我不确定实际上是否有任何%@接受的修饰符)。

3

子数可能是像NSNumber这样的类的对象。就像我们使用%d代表int,%f代表float,%@是参考文献的占位符。在这种情况下

NSNumber *subnumber = [NSNumber numberWithInt:5]; 
NSLog([NSString stringWithFormat:@"%@-1", subnumber]); 

将打印 '5-1'

+1

我建议不要使用动态创建的字符串作为第一个参数到'NSLog()'。事实上,如果我没有记错的话,编译器会警告它。 – 2011-11-03 05:45:33

+0

'NSLog'的参数已经是一个格式化字符串,所以你应该只写'NSLog(@“%@ - 1”,子编号);' – darvids0n