it-swarm.it

Prima lettera maiuscola in NSString

Come posso scrivere in maiuscolo la lettera iniziale di una NSString e rimuovere qualsiasi accento?

Ad esempio, Àlter, Alter, alter dovrebbe diventare Alter.

Ma, /lter, )lter, :lter dovrebbe rimanere il same , poiché il primo carattere non è una lettera. 

36

Dato che vuoi rimuovere i segni diacritici, puoi usare questo metodo in combinazione con i metodi di manipolazione delle stringhe comuni, come questo:

/* create a locale where diacritic marks are not considered important, e.g. US English */
NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"] autorelease];

NSString *input = @"Àlter";

/* get first char */
NSString *firstChar = [input substringToIndex:1];

/* remove any diacritic mark */
NSString *folded = [firstChar stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:locale];

/* create the new string */
NSString *result = [[folded uppercaseString] stringByAppendingString:[input substringFromIndex:1]];
53
dreamlax

Per favore NON usare questo metodo. Perché una lettera può avere un conteggio diverso in una lingua diversa. Puoi controllare la risposta dreamlax per quello. Ma sono sicuro che impareresti qualcosa dalla mia risposta. Felice codifica :)

NSString *capitalisedSentence = nil;

//Does the string live in memory and does it have at least one letter?
if (yourString && yourString.length > 0) {
    // Yes, it does.

     capitalisedSentence = [yourString stringByReplacingCharactersInRange:NSMakeRange(0,1)
                                                               withString:[[yourString substringToIndex:1] capitalizedString]];
} else {
    // No, it doesn't.
}

Perché dovrei preoccuparmi del numero di lettere?

Se provi ad accedere (ad esempio NSMakeRange, substringToIndex etc) il primo carattere in una stringa vuota come @"", quindi la tua app andrà in crash. Per evitare ciò, è necessario verificare che esista prima di elaborarlo.

E se la mia stringa fosse nulla?

Mr.Nil: I'm 'nil'. Posso digerire tutto ciò che mi mandi. Non permetterò alla tua app di bloccarsi da sola. ;)

Animation of a person swallowing fake explosives, it going off in his stomach, and then smoke coming from his mouth in a cartoonish fashion without injury.

nil osserverà qualsiasi chiamata di metodo che gli invii.

Quindi digerirà tutto ciò che proverai, nil è tuo amico.

Puoi usare NSString 's:

- (NSString *)capitalizedString

oppure (iOS 6.0 e versioni successive):

- (NSString *)capitalizedStringWithLocale:(NSLocale *)locale

90
meaning-matters

Devo lasciare una lista di passaggi che penso tu possa usare per ottenere questo risultato. Spero che tu possa seguire senza un problema! :)

  • Usa decomposedStringWithCanonicalMapping per decomporre qualsiasi accento (Importante per assicurarsi che i caratteri accentati non vengano solo rimossi inutilmente)
  • Usa characterAtIndex: per estrarre la prima lettera (indice 0), usa upperCaseString per trasformarla in caratteri maiuscoli e usa stringByReplacingCharactersInRange per rimettere la prima lettera nella stringa originale. 
  • In questo passaggio, PRIMA di trasformarlo in maiuscolo, puoi verificare se la prima lettera è uno dei caratteri che non desideri sostituire, ad es. ":" o ";", e se lo è, non proseguire con il resto della procedura.
  • Esegui un codice [theString stringByReplacingOccurrencesOfString:@" "withString: @" "]` per richiamare eventuali accenti rimasti.

Tutto questo dovrebbe sia capitalizzare la tua prima lettera E rimuovere qualsiasi accento :)

2
Madhu

Sto usando questo metodo per situazioni simili, ma non sono sicuro che la domanda venga posta in lettere minuscole. 

- (NSString *)capitalizedOnlyFirstLetter {

    if (self.length < 1) {
        return @"";
    }
    else if (self.length == 1) {
        return [self capitalizedString];
    }
    else {

        NSString *firstChar = [self substringToIndex:1];
        NSString *otherChars = [self substringWithRange:NSMakeRange(1, self.length - 1)];

        return [NSString stringWithFormat:@"%@%@", [firstChar uppercaseString], [otherChars lowercaseString]];
    }
}
1
Josip B.

Dal momento che iOS 9.0 esiste un metodo per capitalizzare la stringa usando le impostazioni locali correnti:

@property(readonly, copy) NSString *localizedCapitalizedString;
0
ASLLOP

Solo per aggiungere alcune opzioni, io uso questa categoria per scrivere in maiuscolo la prima lettera di un NSString.

@interface NSString (CapitalizeFirst)
    - (NSString *)capitalizeFirst;
    - (NSString *)removeDiacritic;
@end

@implementation NSString (CapitalizeFirst)
- (NSString *)capitalizeFirst {
    if ( self.length <= 1 ) {
        return [self uppercaseString];
    }
    else {
        return [[[[self substringToIndex:1] removeDiacritic] uppercaseString] stringByAppendingString:[[self substringFromIndex:1] removeDiacritic]];
        // Or: return [NSString stringWithFormat:@"%@%@", [[[self substringToIndex:1] removeDiacritic] uppercaseString], [[self substringFromIndex:1] removeDiacritic]];
    }
}

- (NSString *)removeDiacritic { // Taken from: http://stackoverflow.com/a/10932536/1986221
    NSData *data = [NSData dataUsingEncoding:NSASCIIStringEncoding
                       allowsLossyConversion:YES];
    return [[NSString alloc] initWithData:data
                                 encoding:NSASCIIStringEncoding];
}
@end

E poi puoi semplicemente chiamare:

NSString *helloWorld  = @"hello world";
NSString *capitalized = [helloWorld capitalizeFirst];
NSLog(@"%@ - %@", helloWorld, capitalized);
0
Alejandro Iván