Dividir um NSString para acessar uma parte específica


142

Eu tenho uma string como esta: @"10/04/2011"e quero salvar apenas o "10" em outra string. Como eu posso fazer isso?


1
A melhor solução seria usar o NSDate e o NSDateFormatter. Crédito extra e código de melhor qualidade se você realmente o localizar no sistema para talvez lidar com as diferenças mês / dia dia / mês.
EricLeaf

@EricLeaf, onde na pergunta ele diz que a string é uma data?
JeremyP

Respostas:


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

Atualização 03/03/2018:

Agora que a pergunta adquiriu uma tag Swift, devo adicionar a maneira Swift de fazer isso. É tão simples quanto:

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

Embora note que ele fornece uma variedade de Substring. Se você precisar convertê-los novamente em seqüências comuns, usemap

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

ou

let firstBit = String(substrings[0])

1
O uso [foo firstObject]pode ser melhor no caso geral, porque também manipulará adequadamente a matriz vazia.
Bobrovsky

2
@Bobrovsky no caso geral, seria melhor validar a string para garantir que seja uma data. Este é apenas um exemplo que responde à pergunta específica. Também é mais generalizado obter qualquer uma das três partes da data.
JeremyP

Apesar das massas de votos, tenho que discordar. Primeiro, por que você acha que o 10 é dia em vez de mês? Esse tipo de abordagem equivocada é o motivo pelo qual tivemos o problema do ano 2000.
EricLeaf

2
@EricLeaf A pergunta diz "Eu só quero salvar os 10 em uma string". Eu poderia ter chamado a variável de qualquer coisa. A resposta está correta para a pergunta. De fato, em nenhum lugar a pergunta diz que é uma data, então eu alterei a resposta.
JeremyP

36

Qualquer um destes 2:

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

Embora tenha em mente que, às vezes, uma sequência de datas não é formatada corretamente e um dia (ou um mês) é mostrado como 8, em vez de 08, portanto a primeira pode ser a pior das 2 soluções.

O último deve ser colocado em uma matriz separada, para que você possa realmente verificar o tamanho da coisa retornada, para que você não obtenha nenhuma exceção lançada no caso de uma sequência de datas corrompida ou inválida de qualquer fonte que você tenha.


está correto, observe que no método subStringWithRange o segundo "S" não deve ser "minúsculo" (substringWithRange) ou você receberá um erro como "este método não existe".
Marcos Reboucas

9

Está funcionando bem

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

8

Objetivo-c:

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

Rápido:

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


5

Formatei a boa solução fornecida por JeremyP acima em uma função reutilizável mais genérica abaixo:

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

5
Por que não usar diretamente componentsSeparatedByString?
John Gibb

1
porque estou usando-o em vários projetos, portanto, se alguma coisa mudar, só preciso alterar o corpo da função do wrapper em vez de em vários lugares. Mas se você estiver usando apenas uma vez, então sim, faz mais sentido usá-lo diretamente Felicidades!
Khayrattee Wasseem 28/03/2013

3
componentsSeparatedByString não mudou em algo como duas décadas. Você encerra todas as chamadas de método da Apple, caso elas mudem? Você deve digitar muito.
tooluser 23/05

1

Versão Swift 3.0

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.