NSString stringWithFormat的动态字符串格式

我一直在尝试创建一个动态字符串格式,以便通过用户选项精度或填充可以在某种程度上由用户定义。

一个例子包括,以24小时时间格式填充前导零。 在正常时间格式中,小时数可以用一个数字表示,也可以用零填充的数字表示。 这以字符串格式表示:

...stringWithFormat:@"Hour: %02i", hour // leading zero padded 

 ...stringWithFormat:@"Hour: %i", hour // not leading zero padded 

我想要实现的是拥有一个包含@""@"02"变量,并在%i之间的格式字符串中显示该变量。

我做了几个实验,似乎无法做到这一点,并开始认为使用stringWithFormat

我试过了:

...stringWithFormat:@"Hour: %%@i", padding, hour

...stringWithFormat:@"Hour: %@%i", padding, hour

和别的。

有任何想法吗?

有一个更好的方法来做到这一点。

 ... stringWithFormat:@"Hour: %0*i", length, hour]; // note the asterisk 

其中length是您想要的位数。 使用1得不到前导零,根据需要使用2得到长度为2的前导零。

仅供参考 – 要解决您最初尝试过的问题,您需要分两步完成:

 NSString *dynFmt = [NSString stringWithFormat:@"Hour: %%%@i", padding]; NSString *res = [NSString stringWithFormat:dynFmt, hour]; 

使用两个步骤:

  NSString* hourString=nil; if(...){ hourString=[NSString stringWithFormat:@"%i", hour]; }else{ hourString=[NSString stringWithFormat:@"%02i", hour]; } NSString* result=[NSString stringWithFormat:@"Hour: %@", hourString]; 

以下被认为是一种不好的做法:

  NSString* formatString=nil; if(...){ formatString=@"Hour: %i"; }else{ formatString=@"Hour: %02i"; } NSString* result=[NSString stringWithFormat:formatString, hour]; 

因为拥有一个变量formatString是非常危险的,它可以用于许多类型的cracker攻击。

我认为你可以在一个完全独立的阶段建立你的格式,然后使用它。 另外,不要忘记逃避其中一个%以使其成为文字。

 NSString *format = [NSString stringWithFormat:@"%%%@i", padding]; NSString *result = [NSString stringWithFormat:@"Hour: %@", format]; 

更新:oops maddy的回答指出了我的问题:要逃避%,你应该使用%%,而不是\%。 回答更新。