dynamic string format with NSString stringWithFormat

匆匆过客 提交于 2019-12-03 09:41:09

问题


I've been trying to make a dynamic string format so that through user options precision or padding could be somewhat user defined.

An example includes, the padding of leading zeros as in the 24hour time format. In normal time format, the hours can be represented by a single digit, or a digit padded by a zero. This is represented in the string format:

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

and

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

What I would like to achieve is to have a variable containing either @"" or @"02" and have that variable presented in the format string between the % and the i.

I have done a couple of experiments and just can't seem to do this and am beginning to think that it's not possible with stringWithFormat.

I've tried:

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

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

and others.

Any ideas?


回答1:


There's a better way to do this.

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

where length is the number of digits you want. Use 1 to get no leading zeros, use 2 to get a length of 2 with leading zeros as needed.

FYI - to solve what you originally tried you need to do it in two steps:

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



回答2:


Use two steps:

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

The following is considered a bad practice:

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

because it's very dangerous to have a variable formatString, which can be used in many types of cracker attacks.




回答3:


I think you could build up your format in an entirely separate stage, then use that. Also, don't forget to escape one of the %'s to make it literal.

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

update: oops maddy's answer pointed out a problem with mine: to escape a %, you should use %%, not \%. answer updated.



来源:https://stackoverflow.com/questions/13696188/dynamic-string-format-with-nsstring-stringwithformat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!