2009-05-19 16 views
10

Vorrei modificare il primo carattere di una NSString in maiuscolo. Sfortunatamente, - (NSString *)capitalizedString converte la prima lettera di ogni parola in maiuscolo. C'è un modo semplice per convertire solo un singolo carattere in maiuscolo?Modo semplice per impostare un carattere singolo di una NSString in maiuscolo

Attualmente sto usando:

NSRange firstCharRange = NSMakeRange(0,1); 
NSString* firstCharacter = [dateString substringWithRange:firstCharRange]; 
NSString* uppercaseFirstChar = [firstCharacter originalString]; 
NSMutableString* capitalisedSentence = [originalString mutableCopy]; 
[capitalisedSentence replaceCharactersInRange:firstCharRange withString:uppercaseFirstChar]; 

che sembra un po 'contorto, ma almeno non fa alcuna ipotesi circa la codifica della stringa unicode sottostante.

+0

C'è una buona discussione sulla mappatura dei casi qui: http://userguide.icu-project.org/transforms/casemappings Nella terminologia di quella pagina, è ciò che si desidera fare una semplice mappatura dei caratteri? – sbooth

+0

@sbooth - lo è. –

risposta

3

Poiché NSString è immutabile, quello che hai sembra essere un buon modo per fare ciò che vuoi fare. Le implementazioni di (NSString*)uppercaseString e metodi simili probabilmente assomigliano molto a quello che hai scritto, poiché restituiscono un nuovo NSString invece di modificare quello a cui hai inviato il messaggio.

+0

sembra che un trattino basso sia considerato un separatore valido, quindi foo_bar sarà convertito in "Foo_Bar" – dwery

17

approccio molto simile a quello che si ha, ma un po 'più di condensa:

NSString *capitalisedSentence = 
    [dateString stringByReplacingCharactersInRange:NSMakeRange(0,1) 
    withString:[[dateString substringToIndex:1] capitalizedString]]; 
+2

sì, ottimizzato per cr/lf ;-) Mi piace lasciare che l'ottimizzatore togli i miei proventi. –

1

ho avuto un requisito analogo, ma era per i caratteri all'interno della stringa. Questo i assumendo è il vostro indice del carattere da maiuscolo questo ha funzionato per me:

curword = [curword stringByReplacingCharactersInRange:NSMakeRange(i,1) 
      withString:[[curword substringWithRange:NSMakeRange(i, 1)] capitalizedString]]; 
1

Se il profilo queste soluzioni sono molto più lento poi facendo questo:

NSMutableString *capitolziedString = [NSMutableString stringWithString:originalString]; 
NSString *firstChar = [[capitolziedString substringWithRange:NSMakeRange(0,1)] uppercaseString]; 
[capitolziedString replaceCharactersInRange:NSMakeRange(0, 1) withString:firstChar]; 

nella sperimentazione su un iPhone 4 con iOS 5:
@ soluzione di doomspork eseguita in 0,115750 ms
mentre in precedenza è stata eseguita in 0,064250 ms;

in fase di test su un simulatore di iOS 5:
@ soluzione doomspork corse in 0.021232 ms
mentre sopra corse in 0.007495 ms;

+0

Se questa funzione è stata eseguita ripetutamente, potrebbe essere preoccupante che la soluzione venga eseguita da 1/3 a 1/2 del tempo, ma come è, stiamo cercando la soluzione "più semplice", che può essere letta come la più leggibile. – ArtOfWarfare

+0

@ArtOfWarfare La mia soluzione non è molto più difficile da leggere, quindi la tua è e se vuoi incapsulare la soluzione all'interno di una categoria, che probabilmente non guarderai mai più, allora dovresti costruire la soluzione più veloce in modo da non avere qualche strano problema di prestazioni in seguito perché hai scritto codice inefficiente. – odyth

1

Puntando per la massima leggibilità, fare un category su NSString e dare questa funzione:

NSString *capitalizeFirstLetter(NSString *string) { 
    NSString *firstCapital = [string substringToIndex:1].capitalizedString; 
    return [string stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:firstCapital]; 
} 

Poi nel codice in cui si desidera che:

NSString *capitalizedSentence = capitalizeFirstLetter(dateString); 

Questo tipo di codice appartiene raramente in il punto in cui è necessario e dovrebbe generalmente essere scomposto in una classe di utilità o in un category per migliorare la leggibilità.

Problemi correlati