2012-01-26 24 views
42

Sto sviluppando un'applicazione per iPhone. In un'etichetta, voglio mostrare la prima lettera del nome di un utente in maiuscolo. Come lo faccio?Come rendere la prima lettera maiuscola in una UILabel?

+0

Dove vuoi mostrarlo? In una casella di testo o un'etichetta o ...? –

+5

Hai controllato la documentazione NSString per un metodo che sembra restituire una stringa in maiuscolo? – UIAdam

+0

Se stai facendo questo con un cognome, tieni presente che le regole di maiuscole dei cognomi variano. Alcuni cognomi, come McDonald o O'Conor, hanno lettere maiuscole diverse dalla prima. –

risposta

83

Se c'è una sola parola-NSString, quindi utilizzare il metodo

-capitalizedString

NSString *capitalizedString = [myStr capitalizedString]; // capitalizes every word 

In caso contrario, per le stringhe multiple di parole, è necessario estrarre primo carattere e fare solo quello maiuscolo carattere.

+1

come indicato di seguito: questo metodo capitalizza ogni parola del 'NSString' –

+9

" capitalizedString "Restituisce: Una stringa con il primo carattere di ciascuna parola nel ricevitore è stata modificata con il corrispondente valore in lettere maiuscole e tutti i caratteri rimanenti sono stati impostati con i corrispondenti valori in lettere minuscole . – fullMoon

+3

Questa risposta è sia corretta che errata – Mutawe

57

(24-07-2014: la risposta attualmente accettata non è corretta) La domanda è molto specifica: creare la prima lettera maiuscola, lasciare il resto in minuscolo. L'utilizzo di capitalizedString produce un risultato diverso: "String in maiuscolo" anziché "Stringa in maiuscolo". C'è un'altra variante a seconda del locale, che è capitalizedStringWithLocale, ma non è corretto per lo spagnolo, in questo momento è usando le stesse regole come in inglese, quindi questo è come sto facendo per lo spagnolo:

NSString *abc = @"this is test"; 

abc = [NSString stringWithFormat:@"%@%@",[[abc substringToIndex:1] uppercaseString],[abc substringFromIndex:1] ];  
NSLog(@"abc = %@",abc); 
+2

Non è esattamente la risposta del berillio? –

+8

No. La risposta di Berillio capitalizza ogni parola di una NSString. –

+3

questo genererà un'eccezione sulla stringa vuota –

6

Questo è per la categoria NSString+Util ...

- (NSString *) capitalizedFirstLetter { 
    NSString *retVal; 
    if (self.length < 2) { 
     retVal = self.capitalizedString; 
    } else { 
     retVal = string(@"%@%@",[[self substringToIndex:1] uppercaseString],[self substringFromIndex:1]); 
    } 
    return retVal; 
} 

si può fare con NSString stringWithFormat, naturalmente. Io uso questa stranezza:

#define string(...) \ 
[NSString stringWithFormat:__VA_ARGS__] 
+0

Non è necessario verificare se stessi poiché il metodo di categoria non verrà chiamato in quel caso. E le prime tre condizioni possono essere sostituite con if (self.length <= 1) return self.capitalizedString per semplicità. –

+0

Hai ragione, ma penso che se la stringa fosse stata dealloc, potrebbe essere nulla. Il tuo punto rimane, sulla semplificazione. Grazie –

+0

Anche se la stringa è stata deallocata (cosa che potrebbe accadere solo in un contesto con multithreading con gestione errata della memoria), il sé rimarrebbe un puntatore pendente e non sarebbe nullo. –

1

ecco un'estensione rapida per esso

extension NSString { 
    func capitalizeFirstLetter() -> NSString { 
     return self.length > 1 ? 
      self.substringToIndex(1).capitalizedString + self.substringFromIndex(1) : 
      self.capitalizedString 
    } 
} 
0

Questo è come ha funzionato per me:

NSString *serverString = jsonObject[@"info"]; 

NSMutableString *textToDisplay = [NSMutableString stringWithFormat:@"%@", serverString]; 

[textToDisplay replaceCharactersInRange:NSMakeRange(0, 1) withString:[textToDisplay substringToIndex:1].capitalizedString]; 

cell.infoLabel.text = textToDisplay; 

Speranza che aiuta.

-1

Swift:

let userName = "hard CODE" 
yourLabel.text = userName.localizedUppercaseString 

Mi consiglia di utilizzare questa versione localizzata di lettere maiuscole, poiché i nomi sono sensibili locale.

7

Nel caso in cui qualcuno è ancora interessato nel 2016, ecco un Swift 3 estensione:

extension String { 
    func capitalizedFirst() -> String { 
     let first = self[self.startIndex ..< self.index(startIndex, offsetBy: 1)] 
     let rest = self[self.index(startIndex, offsetBy: 1) ..< self.endIndex] 
     return first.uppercased() + rest.lowercased() 
    } 

    func capitalizedFirst(with: Locale?) -> String { 
     let first = self[self.startIndex ..< self.index(startIndex, offsetBy: 1)] 
     let rest = self[self.index(startIndex, offsetBy: 1) ..< self.endIndex] 
     return first.uppercased(with: with) + rest.lowercased(with: with) 
    } 
} 

quindi si utilizza esattamente come si farebbe per il solito in maiuscolo() o capitalizzati():

myString.capitalizedFirst() o myString.capitalizedFirst(with: Locale.current)

5

Semplicemente

- (NSString *)capitalizeFirstLetterOnlyOfString:(NSString *)string{ 
    NSMutableString *result = [string lowercaseString].mutableCopy; 
    [result replaceCharactersInRange:NSMakeRange(0, 1) withString:[[result substringToIndex:1] capitalizedString]]; 

    return result; 
}