2009-05-19 8 views
10

Me gustaría cambiar el primer carácter de un NSString a mayúscula. Desafortunadamente, - (NSString *)capitalizedString convierte la primera letra de cada palabra en mayúscula. ¿Hay una manera fácil de convertir solo un carácter a mayúscula?Manera fácil de establecer un solo carácter de un NSString en mayúscula

actualmente estoy usando:

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

que parece un poco complicado, pero al menos no hace suposiciones acerca de la codificación de la cadena Unicode subyacente.

+0

Hay una buena discusión sobre mapeo de casos aquí: http://userguide.icu-project.org/transforms/casemappings En la terminología de esa página, ¿qué es lo que quiere hacer una asignación de caracteres simple? – sbooth

+0

@sbooth - lo es. –

Respuesta

3

Dado que NSString es inmutable, lo que tiene parece ser una buena manera de hacer lo que quiere hacer. Las implementaciones de (NSString*)uppercaseString y métodos similares probablemente se parezcan mucho a lo que ha escrito, ya que devuelven un nuevo NSString en lugar de modificar el que envió el mensaje.

+0

parece que un guión bajo se considera un separador válido, por lo que foo_bar se convertirá en "Foo_Bar" – dwery

17

enfoque muy similar a lo que tiene pero un poco más condensan:

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

, sí, optimizado para cr/lf ;-) Me gusta dejar que el optimizador elimine mis temporarios. –

1

yo tuvimos un requisito similar, pero fue de caracteres dentro de la cadena. Esta i suponiendo que es el índice para el carácter que desea a mayúsculas esto funcionó para mí:

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

Si su perfil de estas soluciones son mucho más lento que hacer esto:

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

en las pruebas en un iPhone 4 con iOS 5:
La solución de @ doomspork se ejecutó en 0.115750 ms
mientras que la anterior se ejecutó en 0.064250 ms;

prueba en prueba en un simulador de iOS 5:
@ solución de doomspork corrieron en 0.021232 ms
mientras que por encima corrió en 0.007495 ms;

+0

Si esta función se ejecutara repetidamente, podría ser preocupante que su solución se ejecute en 1/3 a 1/2 vez, pero como es, estamos buscando la solución "más fácil", que podría leerse como la más legible. – ArtOfWarfare

+0

@ArtOfWarfare Mi solución no es mucho más difícil de leer que la tuya y si vas a encapsular la solución dentro de una categoría, que probablemente nunca volverás a mirar, entonces debes construir la solución más rápida para que no tengas algún extraño problema de rendimiento más tarde porque escribió un código ineficiente. – odyth

1

Con el objetivo de facilitar la lectura máxima, hacer una category en NSString y darle esta función:

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

Luego, en el código donde desee:

NSString *capitalizedSentence = capitalizeFirstLetter(dateString); 

Este tipo de código rara vez pertenece en el lugar donde lo necesita y generalmente debe tenerse en cuenta en una clase de utilidad o category para mejorar la legibilidad.

Cuestiones relacionadas