拆分NSString以访问一个特定的片段


142

我有一个这样的字符串:@"10/04/2011"我只想在另一个字符串中保存“ 10”。我怎样才能做到这一点?


1
最好的解决方案是使用NSDate和NSDateFormatter。如果您实际将其本地化到系统中,以解决月/日/日/月的差异,则可以获得额外的信用和更好的质量代码。
EricLeaf

@EricLeaf在问题中哪里说字符串是日期?
JeremyP

Answers:


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

更新7/3/2018:

既然问题已经获得了Swift标签,我应该添加Swift的方法。非常简单:

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

尽管请注意,它为您提供了的数组Substring。如果您需要将它们转换回普通字符串,请使用map

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

要么

let firstBit = String(substrings[0])

1
[foo firstObject]在一般情况下使用可能会更好,因为它也可以正确处理空数组。
Bobrovsky 2014年

2
在一般情况下,@ Bobrovsky最好验证字符串以确保它是日期。这只是一个回答特定问题的例子。获取三个日期部分中的任何一个也更通用。
JeremyP 2014年

尽管有很多支持者,我还是不同意。首先,您为什么认为10是天而不是月?这种错误的思路是我们遇到Y2K问题的原因。
EricLeaf

2
@EricLeaf这个问题说“我只想将10保存为一个字符串”。我可以将变量称为任何东西。这个问题的答案是正确的。实际上,问题在任何地方都没有说是约会,所以我修改了答案。
JeremyP 2015年

36

这些2:

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

尽管请记住,有时日期字符串的格式不正确,并且一天(或该日期的一个月)显示为8,而不是08,所以第一个可能是2种解决方案中最差的一种。

后者应该放在一个单独的数组中,这样您就可以实际检查返回的内容的长度,因此,无论您拥有的任何来源的日期字符串损坏或无效,都不会引发任何异常。


没错,请注意,在subStringWithRange方法中,第二个“ S”不应为“小写”(substringWithRange),否则会出现类似“此方法不存在”的错误。
Marcos Reboucas

9

工作正常

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

8

目标-c:

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

迅速:

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


5

我已经将上面JeremyP提供不错的解决方案格式化为下面更通用的可重用函数:

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

5
为什么不直接使用componentsSeparatedByString?
John Gibb 2013年

1
因为我在多个项目中使用它,所以如果有任何更改,我只需要更改包装函数的主体即可,而不必在多个地方进行更改。但是,如果您只使用一次,那么是的,直接使用它更有意义 !
Khayrattee Wasseem

3
componentsSeparatedByString大约二十年来没有改变。您包装所有Apple方法调用以防它们更改吗?您必须输入很多。
tooluser 2014年

1

Swift 3.0版本

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.