2012-12-04 46 views
9

Tôi đã cố tạo một định dạng chuỗi động để thông qua độ chính xác hoặc tùy chọn của người dùng có thể được người dùng xác định một phần.định dạng chuỗi động với chuỗi NSStringWithFormat

Ví dụ bao gồm, phần đệm của số 0 đứng đầu theo định dạng thời gian 24h. Trong định dạng thời gian bình thường, giờ có thể được biểu thị bằng một chữ số duy nhất hoặc một chữ số được đệm bằng số không. Này được thể hiện trong định dạng chuỗi:

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

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

Những gì tôi muốn đạt được là phải có một biến chứa hoặc @"" hoặc @"02" và đã biến mà thể hiện trong chuỗi định dạng giữa %i.

Tôi đã thực hiện một vài thử nghiệm và dường như không thể làm điều này và bắt đầu nghĩ rằng điều đó là không thể với stringWithFormat.

Tôi đã thử:

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

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

và những người khác.

Bất kỳ ý tưởng nào?

+0

Giá trị biến i là gì? –

+0

trong trường hợp này, nó chỉ là một số nguyên – Madivad

Trả lời

33

Có cách tốt hơn để thực hiện việc này.

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

nơi length là số chữ số bạn muốn. Sử dụng 1 để không có số 0 đứng đầu, sử dụng 2 để có độ dài là 2 với số 0 đứng đầu khi cần.

FYI - để giải quyết những gì bạn ban đầu cố gắng bạn cần phải làm điều đó trong hai bước:

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

Tại sao downvote? Chuyện gì vậy? – rmaddy

+0

Có vẻ đúng với tôi –

+0

Cảm ơn @rmaddy +1 vì '*' hoạt động hoàn hảo cho những gì tôi đã làm sau, và trong một dòng mã :-) – Madivad

4

Sử dụng hai bước sau:

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

Sau đây được coi là một thực tế xấu:

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

vì nó rất nguy hiểm để có một formatString biến, có thể được sử dụng trong nhiều loại tấn công cracker .

-1

Tôi nghĩ rằng bạn có thể xây dựng lên định dạng của bạn trong một giai đoạn hoàn toàn riêng biệt, sau đó sử dụng đó. Ngoài ra, đừng quên để thoát khỏi một trong những% 's để làm cho nó theo nghĩa đen.

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

cập nhật: câu trả lời của maddy đã chỉ ra một vấn đề với tôi: để thoát khỏi%, bạn nên sử dụng %%, không \%. đã cập nhật câu trả lời.

+2

Bạn cung cấp giá trị 'giờ' ở đâu? – rmaddy

Các vấn đề liên quan