我一直在尝试制作动态字符串格式,以便通过用户选项精度或填充可以在某种程度上由用户定义。
一个例子包括,以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
和其他人。
有什么想法吗?
答案 0 :(得分:34)
有一种更好的方法可以做到这一点。
... 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];
答案 1 :(得分:4)
使用两个步骤:
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攻击。
答案 2 :(得分:-1)
我认为你可以在一个完全独立的阶段建立你的格式,然后使用它。另外,不要忘记转义其中一个%以使其成为文字。
NSString *format = [NSString stringWithFormat:@"%%%@i", padding];
NSString *result = [NSString stringWithFormat:@"Hour: %@", format];
更新:oops maddy的回答指出我的一个问题:要逃避%,你应该使用%%,而不是\%。回答更新。