Dividir un NSString para acceder a una pieza en particular


142

Tengo una cadena como esta: @"10/04/2011"y quiero guardar solo el "10" en otra cadena. ¿Cómo puedo hacer eso?


1
La mejor solución sería usar NSDate y NSDateFormatter. Crédito adicional y código de mejor calidad si realmente lo localiza en el sistema para tal vez lidiar con las diferencias mes / día día / mes.
EricLeaf

@EricLeaf ¿en qué parte de la pregunta dice que la cadena es una fecha?
JeremyP

Respuestas:


376
NSArray* foo = [@"10/04/2011" componentsSeparatedByString: @"/"];
NSString* firstBit = [foo objectAtIndex: 0];

Actualización 7/3/2018:

Ahora que la pregunta ha adquirido una etiqueta Swift, debería agregar la forma Swift de hacerlo. Es casi tan simple:

let substrings = "10/04/2011".split(separator: "/")
let firstBit = substrings[0]

Aunque tenga en cuenta que le da una variedad de Substring. Si necesita convertirlos de nuevo a cadenas normales, usemap

let strings = "10/04/2011".split(separator: "/").map{ String($0) }
let firstBit = strings[0]

o

let firstBit = String(substrings[0])

1
El uso [foo firstObject]podría ser mejor en el caso general porque también manejará adecuadamente la matriz vacía.
Bobrovsky

2
@Bobrovsky en el caso general, sería mejor validar la cadena para asegurarse de que sea una fecha. Este es solo un ejemplo que responde a la pregunta específica. También es más generalizable obtener cualquiera de las tres partes de fecha.
JeremyP

A pesar de la gran cantidad de votos a favor, tengo que estar en desacuerdo. Primero, ¿por qué crees que el 10 es día en lugar de mes? Este tipo de enfoque equivocado es la razón por la que tuvimos el problema Y2K.
EricLeaf

2
@EricLeaf La pregunta dice "Solo quiero guardar los 10 en una cadena". Podría haber llamado a la variable cualquier cosa. La respuesta es correcta para la pregunta. De hecho, en ninguna parte la pregunta dice que es una fecha, así que modifiqué la respuesta.
JeremyP

36

Cualquiera de estos 2:

NSString *subString = [dateString subStringWithRange:NSMakeRange(0,2)];
NSString *subString = [[dateString componentsSeparatedByString:@"/"] objectAtIndex:0];

Sin embargo, tenga en cuenta que a veces una cadena de fecha no está formateada correctamente y un día (o un mes) se muestra como 8, en lugar de 08, por lo que la primera podría ser la peor de las 2 soluciones.

Este último debe colocarse en una matriz separada para que pueda verificar la longitud de la cosa devuelta, para que no se produzcan excepciones en el caso de una cadena de fecha corrupta o inválida de cualquier fuente que tenga.


eso es correcto, solo tenga en cuenta que en el método subStringWithRange la segunda "S" no debe ser "minúscula" (substringWithRange) o obtendrá un error como "este método no existe".
Marcos Reboucas

9

Está funcionando bien

NSString *dateString = @"10/10/2010";//Date 
NSArray* dateArray = [dateString componentsSeparatedByString: @"/"];
NSString* dayString = [dateArray objectAtIndex: 0];

8

C objetivo:

     NSString *day = [@"10/04/2011" componentsSeparatedByString:@"/"][0];

Rápido:

     var day: String = "10/04/2011".componentsSeparatedByString("/")[0]


5

He formateado la buena solución proporcionada por JeremyP arriba en una función reutilizable más genérica a continuación:

///Return an ARRAY containing the exploded chunk of strings
+(NSArray*)explodeString:(NSString*)stringToBeExploded WithDelimiter:(NSString*)delimiter
{
    return [stringToBeExploded componentsSeparatedByString: delimiter];
}

55
¿Por qué no solo usar componentsSeparatedByString directamente?
John Gibb

1
porque lo estoy usando en varios proyectos, así que si algo cambia, solo tengo que cambiar el cuerpo de la función de envoltura en lugar de hacerlo en varios lugares. Pero si solo lo está usando una vez, entonces sí tiene más sentido usarlo directamente ¡Saludos!
Khayrattee Wasseem

3
componentsSeparatedByString no ha cambiado en algo así como dos décadas. ¿Envuelve todas las llamadas al método Apple en caso de que cambien? Debes escribir mucho.
tooluser

1

Versión Swift 3.0

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.