Is dit moontlik om formaatstringe te gebruik om NSStrings in lyn te bring soos getalle kan wees?
-
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.
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.