2012-12-04 17 views
9

Dinamik bir dize formatı oluşturmaya çalışıyorum, bu sayede kullanıcı seçenekleri hassasiyeti veya dolgusu bir şekilde kullanıcı tarafından tanımlanabilir.NSString dizesiyle dinamik dize biçimiWithFormat

Örnek olarak, 24 saatlik zaman biçimindeki öncü sıfırlar doldurulur. Normal zaman formatında, saatler tek bir rakamla veya sıfır ile doldurulmuş bir rakamla gösterilebilir. Bu dize biçiminde temsil edilir:

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

ve

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

Ne elde etmek istiyorum olduğunu

içeren bir değişken olması @"" veya @"02" ve bu değişken arasındaki biçim dizesi sunulan ya % ve i.

Birkaç deneme yaptık ve bunu yapamıyorum ve stringWithFormat ile mümkün olmadığını düşünmeye başladım.

denedim:

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

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

ve diğerleri.

Herhangi bir fikrin var mı?

+0

i değişken değeri ne olmalıdır? –

+0

Bu durumda, sadece bir tam sayı – Madivad

cevap

33

Bunu yapmanın daha iyi bir yolu var. length istediğiniz basamak sayısıdır

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

. Önde gelen sıfırları almak için 1 kullanın, gerektiğinde baştaki sıfırlarla 2 uzunluğa sahip olmak için 2 kullanın. Bilginize

- Başlangıçta iki adımda bunu yapmak gerekir çalıştı neyi çözmek için:

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

Neden downvote? Sorun nedir? – rmaddy

+0

Bana uygun görünüyor –

+0

'@' için @admaddy +1, neyden olduğum için mükemmel bir şekilde çalışıyor ve tek satırlık bir kod içinde :-) – Madivad

4

Kullanım iki adım:

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

kötü bir uygulama olarak kabul edilir aşağıdadır:

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

o kraker saldırıları birçok çeşit kullanılabilecek bir değişken biçemdizgesi, olması çok tehlikeli çünkü .

-1

Bunu kullanmak sonra, tamamen ayrı bir aşamada Formatınızı kadar inşa edebileceğini düşünüyorum. Ayrıca, bunu yapmak için% 'lerden birini kaçırmayı unutmayın.

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

güncelleme: oops Maddy'nin cevabı mayın ile ilgili bir sorun işaret: a% kaçmak için, sen değil \% %% kullanmalısınız. cevap güncellendi.

+2

Burada 'hour' değerini nereden temin ediyorsunuz? – rmaddy