Is dit moontlik om formaatstringe te gebruik om NSStrings in lyn te bring soos getalle kan wees?

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

  •  13-09-2019
  •  | 
  •  

Vra

Ek gebruik NSLog() om 'n paar tabeldata te druk wat bestaan ​​uit 'n NSString en 'n geassosieerde heelgetal.

Gestel ek ken die lengte van die langste woord.

Is daar 'n manier om te gebruik formateer stringe om hierdie soort kolombelyning te kry:

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

Die rede waarom ek vra oor die formatering van stringe, is dat ek hoop op 'n ligte manier om my ghetto-ontfoutingsuitvoer te formateer.

Hier is wat ek probeer het:

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

Resultaat:

woord:boom rang:4

Glad geen effek nie.

Was dit nuttig?

Oplossing

Die volgende blyk te werk, maar vereis omskakeling van jou NSString se C-stringe.

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

Weet nie hoekom die breedte veld is geïgnoreer word wanneer ek probeer om 'n NSString gebruik.

Ander wenke

Ja, net soos printf.

Volgens die dokumentasie , stringWithFormat: gehoorsaam die IEEE printf spesifikasie, wat alle vorme van veranderings kan op die individuele argumente. Die dokumentasie het 'n beperkte subset van daardie inligting, maar hulle verwys na die OpenGroup printf spesifikasie vir Unix om die volledige inligting gee (ter waarde van 'n lees, kan jy 'n baie truuks met formaat spesifiseerders bereik).

Probeer hierdie, te kry presies wat jy hierbo het geplak:

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

Hier is 'n voorbeeld van hoe ek my debugging uitvoer formaat (Ek gebruik nie NSLog, ek draai druk op standaard fout om lêer en lyn te kry, te):

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

As jy iets soos die vorige antwoord te doen:

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

... jy kan encoding-omskakeling probleme vir nie-ASCII karakters kry ... stringWithFormat lyk die stelsel verstek enkodering, wat nog MacRoman vir 'n paar mal rede aanvaar. Jy kan af daal tot die stdlib vlak - doen al jou opmaak met sprintf in jou eie buffer, en dan kan jy die enkodering beheer wanneer die skep van 'n NSString uit wat - maar dit is omslagtig. As iemand weet 'n gerieflike tydelike oplossing, Ek is die ene ore.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top