E 'possibile utilizzare stringhe di formato per allineare NSStrings come i numeri possono essere?

StackOverflow https://stackoverflow.com/questions/1671531

  •  13-09-2019
  •  | 
  •  

Domanda

sto usando NSLog () per stampare alcuni dati tabulari costituiti da un NSString e intero associato .

Si supponga che conosco la lunghezza della parola più lunga.

C'è un modo utilizzando stringhe 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 viene Spero in un modo leggero per formattare il mio ghetto di uscita di debug.

Ecco quello che ho provato:

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

Risultato:

parola: albero Classifica: 4

Nessun effetto a tutti.

È stato utile?

Soluzione

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 il motivo per cui la larghezza del campo viene ignorato quando si cerca di utilizzare un NSString.

Altri suggerimenti

Sì, proprio come printf.

Secondo la documentazione , stringWithFormat: obbedisce alla specifica IEEE printf, che consente a tutti i tipi di modifiche sui singoli argomenti. La documentazione ha un sottoinsieme limitato di tali informazioni, ma si collegano alla OpenGroup printf specifiche per Unix per dare le informazioni complete (pena di leggere, è possibile eseguire un sacco di trucchi con identificatori 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 il file e la linea, troppo):

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

Se si fa qualcosa di simile alla precedente risposta:

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

... è possibile ottenere i problemi di codifica di conversione per i caratteri non ASCII ... stringWithFormat sembra assumere la codifica di default del sistema, che è ancora MacRoman per qualche motivo folle. È possibile eliminare fino al livello stdlib - fare tutta la formattazione con sprintf nel proprio buffer e quindi è possibile controllare la codifica durante la creazione di un NSString da quella - ma questo è ingombrante. Se qualcuno conosce una soluzione comoda, sono tutto orecchie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top