एक विशेष टुकड़े तक पहुंचने के लिए एनएसएसट्रिंग को विभाजित करें


142

मेरे पास एक स्ट्रिंग है जैसे: @"10/04/2011"और मैं एक और स्ट्रिंग में केवल "10" बचाना चाहता हूं। मैं उसे कैसे कर सकता हूँ?


1
सबसे अच्छा समाधान NSDate और NSDateFormatter का उपयोग करना होगा। अतिरिक्त क्रेडिट और बेहतर गुणवत्ता कोड यदि आप वास्तव में महीने / दिन के दिन / महीने के मतभेदों से निपटने के लिए सिस्टम में इसका स्थानीयकरण करते हैं।
एरियल शेफ

@ EricLeaf जहां सवाल में यह कहता है कि स्ट्रिंग एक तारीख है?
जेरेमीप

जवाबों:


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

अपडेट 7/3/2018:

अब जब इस सवाल ने स्विफ्ट टैग हासिल कर लिया है, तो मुझे इसे करने का स्विफ्ट तरीका जोड़ना चाहिए। यह बहुत आसान है:

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]सामान्य मामले में उपयोग करना बेहतर हो सकता है क्योंकि यह खाली सरणी को भी ठीक से संभाल लेगा।
बोबरोवस्की

2
सामान्य मामले में @ थ्रोबोर्स्की, यह सुनिश्चित करने के लिए स्ट्रिंग को मान्य करना बेहतर होगा कि यह एक तारीख है। यह केवल एक उदाहरण है जो विशिष्ट प्रश्न का उत्तर देता है। यह तीनों भागों में से किसी एक को प्राप्त करने के लिए अधिक सामान्य है।
जेरेमीप

अपसंस्कृति के जनसमूह के बावजूद मुझे असहमत होना पड़ा है। पहले, आपको क्यों लगता है कि महीने के बजाय 10 दिन है? इस तरह का गलत तरीका है, इसलिए हमें Y2K की समस्या थी।
एरियल शेफ

2
@EricLeaf सवाल कहता है "मैं केवल एक स्ट्रिंग में 10 बचाना चाहता हूं"। मैं चर को कुछ भी कह सकता था। प्रश्न के लिए उत्तर सही है। वास्तव में, कहीं भी प्रश्न यह नहीं कहता है कि यह एक तारीख है, इसलिए मैंने उत्तर में संशोधन किया है।
जेरेमीप

36

इनमें से 2:

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

हालांकि यह ध्यान रखें कि कभी-कभी एक तारीख स्ट्रिंग को ठीक से स्वरूपित नहीं किया जाता है और एक दिन (या उस मामले के लिए एक महीने) को 8 के रूप में दिखाया जाता है, 08 के बजाय इसलिए पहला 2 समाधानों में से सबसे खराब हो सकता है।

उत्तरार्द्ध को एक अलग सरणी में रखा जाना चाहिए ताकि आप वास्तव में लौटाई गई चीज़ की लंबाई की जांच कर सकें, इसलिए आपको किसी भी स्रोत से एक भ्रष्ट या अमान्य तारीख स्ट्रिंग के मामले में फेंका गया कोई अपवाद नहीं मिलता है।


यह सही है, बस ध्यान दें कि उप-स्ट्रिंग विधि में दूसरा "S" "लोअर केस" नहीं होना चाहिए (substringWithRange) या आपको एक त्रुटि मिलेगी जैसे "यह विधि मौजूद नहीं है"।
मार्कोस रेबुकास

9

इसका काम ठीक है

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

8

उद्देश्य सी:

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

स्विफ्ट:

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


5

मैंने जेरेमीप द्वारा प्रदान किए गए अच्छे समाधान को नीचे एक अधिक सामान्य पुन: प्रयोज्य कार्य में स्वरूपित किया है :

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

5
बस घटकों का उपयोग क्यों न करें सीधे बायस्ट्रीमिंग करें?
जॉन गिब

1
क्योंकि मैं इसे कई परियोजनाओं में उपयोग कर रहा हूं, इसलिए यदि कुछ भी बदलता है, तो मुझे कई स्थानों पर केवल रैपर फ़ंक्शन के शरीर को बदलना होगा। लेकिन अगर आप इसे केवल एक बार उपयोग कर रहे हैं, तो हाँ यह सीधे चीयर्स का उपयोग करके अधिक समझ में आता है !
खैराती वासेम

3
ComponentsSeparatedByString दो दशकों की तरह कुछ में नहीं बदला है। क्या आप बदलने के मामले में सभी Apple विधि कॉल को लपेटते हैं? आपको बहुत कुछ लिखना होगा।
टूलसर

1

स्विफ्ट 3.0 संस्करण

let arr = yourString.components(separatedBy: "/")
let month = arr[0]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.