NSStringを分割して1つの特定の部分にアクセスする


142

次のような@"10/04/2011"文字列があります。「10」だけを別の文字列に保存したいのですが。どうやってやるの?


1
最善の解決策は、NSDateとNSDateFormatterを使用することです。実際にシステムにローカライズして月/日/月の違いに対処する場合、追加のクレジットとより高品質のコード。
EricLeaf

@EricLeaf質問のどこに文字列が日付であると記載されていますか?
JeremyP 2015

回答:


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

2018年7月3日更新:

質問が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]空の配列も適切に処理するため、一般的には使用する方がよいでしょう。
ボブロフスキー2014

2
@Bobrovskyは一般的なケースでは、文字列を検証して日付であることを確認することをお勧めします。これは特定の質問に答える単なる例です。また、3つの日付部分のいずれかを取得する方がより一般化できます。
JeremyP 2014年

賛成投票の大衆にもかかわらず、私は同意しなければなりません。まず、なぜ10は月ではなく日だと思いますか?このような間違った方向のアプローチが、Y2K問題が発生した理由です。
EricLeaf 2015

2
@EricLeaf「10を文字列に保存したいだけ」という質問です。変数は何とでも呼べたでしょう。質問の答えは正しいです。実際、日付が日付であるという質問はどこにもないので、答えを修正しました。
JeremyP 2015

36

これらのいずれか2:

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

ただし、日付の文字列が正しくフォーマットされておらず、日(または月)が08ではなく8と表示される場合があるため、最初のものが2つのソリューションの中で最悪の場合があることに注意してください。

後者は別の配列に入れて、返されたものの長さを実際に確認できるようにする必要があります。これにより、ソースが破損しているか無効な日付文字列の場合に例外がスローされません。


そのとおりです。subStringWithRangeメソッドでは、2番目の「S」が「小文字」(substringWithRange)であってはならないことに注意してください。そうしないと、「このメソッドは存在しません」などのエラーが発生します。
Marcos Reboucas、2015

9

正常に動作しています

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

8

Objective-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を直接使用しないのですか?
ジョン・ギブ

1
複数のプロジェクトで使用しているため、変更があった場合は、ラッパー関数の本体をいくつかの場所ではなく変更する必要があります。ただし、一度だけ使用する場合は、直接使用する方が理にかなっています
Khayrattee Wasseem 2013年

3
componentsSeparatedByStringは20年ほど変わっていません。変更があった場合に備えて、すべてのAppleメソッド呼び出しをラップしますか?たくさんタイプしなければならない。
tooluser

1

Swift 3.0バージョン

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.