9

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

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

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

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

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

我已经做了几个实验,但似乎无法做到这一点,并且开始认为这是不可能的stringWithFormat

我试过了:

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

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

和别的。

有任何想法吗?

4

3 回答 3

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];
于 2012-12-04T04:47:17.413 回答
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 是非常危险的,它可以用于多种类型的破解者攻击。

于 2012-12-04T04:46:50.967 回答
-1

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

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

更新:哎呀,麦迪的回答指出了我的一个问题:要转义 %,您应该使用 %%,而不是 \%。答案已更新。

于 2012-12-04T04:47:43.570 回答