2009-11-04 3 views
12

Sto usando NSLog() per stampare alcuni dati tabulari costituiti da un NSString e di un associato intero.È possibile utilizzare stringhe di formato per allineare NSStrings come possono essere i numeri?

Supponiamo che conosca la lunghezza della parola più lunga.

c'è un modo utilizzando stringhe di formato per ottenere questo tipo di allineamento della colonna:

word:tree  rank:5 
word:frog  rank:3 
word:house  rank:2 
word:peppercorn rank:2 
word:sword  rank:2 
word:antlion  rank:1 

Il motivo che mi sto chiedendo sulla formattazione stringhe è che sto sperando in un modo leggero per formattare l'output di debug del ghetto.

Ecco cosa ho provato:

NSString *word = @"tree"; 
NSUInteger rank = 4; 
NSString *str = [NSString stringWithFormat:@"word:%[email protected] rank:%u", word, rank]; 
NSLog(@"%@", str); 

Risultato:

parola: albero Classifica: 4

Nessun effetto a tutti.

+1

hahaha +1 per tag ghetto-debug – nall

risposta

15

Il seguente sembra funzionare, ma richiede la conversione dal NSString di C-stringhe.

NSString *word = @"tree"; 
NSUInteger rank = 4; 
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank]; 
NSLog(@"%@", str); 

Non so perché la larghezza del campo viene ignorata quando si tenta di utilizzare una NSString.

+0

Sì, è strano. –

+0

qual è la stringa completa (ad es. 1 Item1 6 0% 6) come sarebbe? – jongbanaag

+0

@Anthony Cramp: non funzionerà se la lunghezza della stringa è maggiore .... Cosa succede se vuoi tagliare la stringa se la lunghezza della stringa è maggiore della lunghezza della colonna ... – Nit

1

Sì, proprio come printf.

Secondo the documentation, stringWithFormat: rispetta la specifica IEEE printf, che consente tutti i tipi di modifiche sui singoli argomenti. La documentazione ha un sottoinsieme limitato di tali informazioni, ma si collegano allo OpenGroup printf specification for Unix per fornire tutte le informazioni (vale la pena leggere, è possibile eseguire molti trucchi con gli specificatori di formato).

Prova questo, per ottenere esattamente quello che hai incollato sopra:

NSString *word = @"butterfly"; 
NSUInteger rank = 4; 
NSString *str = [NSString stringWithFormat:@"word:%-11s rank:%u", [word UTF8String], rank]; 

Ecco un esempio di come formattare l'output di debugging (io non uso NSLog, mi avvolgo di stampa per errore standard per ottenere di file e la linea, anche):

fprintf(stderr, "%s | %30s:%-5d | %s", [[[NSDate date] description] UTF8String], 
    [fileName UTF8String], line, [body UTF8String]); 
+0

Cosa ottieni se la parola è "albero". Ricevo "word: tree rank: 4" che non sembra reagire allo specificatore di colonna. – willc2

+0

@ willc2: ho modificato la mia risposta con le informazioni di Anthony, provalo. –

+0

@JedSmith, posso sapere come farlo in Swift? TYIA –

0

Se fate qualcosa come la risposta precedente:

NSString *word = @"tree"; 
NSUInteger rank = 4; 
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank]; 
NSLog(@"%@", str); 

... si può ottenere problemi di codifica di conversione per i caratteri non ASCII ... stringWithFormat sembra assumere la codifica di default del sistema, che è ancora MacRoman per una ragione pazzesca. Puoi scendere al livello stdlib - fai tutta la tua formattazione con sprintf nel tuo buffer, e poi puoi controllare la codifica quando crei una NSString da quella - ma è ingombrante. Se qualcuno conosce una soluzione comoda, sono tutto orecchie.

Problemi correlati