NSString से सभी लेकिन नंबर निकालें


157

मेरे पास कुछ कोष्ठक और हाइफ़न के साथ एक एनएसएसट्रिंग (फोन नंबर) है क्योंकि कुछ फ़ोन नंबर प्रारूपित हैं। मैं स्ट्रिंग से संख्याओं को छोड़कर सभी वर्णों को कैसे निकालूंगा?

जवाबों:


375

पुराना सवाल है, लेकिन कैसे:

  NSString *newString = [[origString componentsSeparatedByCharactersInSet:
                [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
                componentsJoinedByString:@""];

यह गैर-अंकों के सेट पर स्रोत स्ट्रिंग का विस्फोट करता है, फिर एक खाली स्ट्रिंग विभाजक का उपयोग करके उन्हें फिर से जोड़ता है। पात्रों के माध्यम से लेने के रूप में कुशल नहीं है, लेकिन कोड में बहुत अधिक कॉम्पैक्ट है।


6
धन्यवाद! अन्य शुरुआती के लिए, आप अपना कस्टम NSCharacterSet बनाकर कर सकते हैंNSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
गुप्त

1
धन्यवाद ! बस मेरी जिज्ञासा के लिए, क्या आपको अंदाजा है कि NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]काम क्यों नहीं हो रहा है?
थॉमस बेस्नेहर्ड

1
@Tommecpe stringByTrimmingCharactersInet केवल स्ट्रिंग की शुरुआत और अंत से हटाता है, इसलिए यह पहले गैर-मिलान चरित्र के बाद, या अंतिम गैर-मिलान वर्ण से पहले प्रभावित नहीं करता है।
सिमोनोबो

मैं केवल संख्या और वर्णमाला रखना चाहता हूं, मैं यह कैसे कर सकता हूं?
जैकी

1
@ ऊपर दिए गए उदाहरण में आप [NSCharacterSet decimalDigitCharacterSet]दूसरे के साथ प्रतिस्थापित करेंगे जिसमें केवल संख्याएँ और अक्षर हैं। आप एक बनाने NSMutableCharaterSetऔर एक पारित करने के लिए decimalDigitCharacterSet, uppercaseLetterCharacterSetऔर lowercaseLetterCharacterSetकरने के लिए कर सकते हैं formUnionWithCharacterSet:। ध्यान दें कि letterCharacterSetइसमें निशान भी शामिल हैं, इसलिए निम्न- और अपरकेस संस्करण का उपयोग करें।
कदम

75

अन्य उत्तरों के अनुसार सुझाव देने के लिए नियमित अभिव्यक्ति पुस्तकालय का उपयोग करने की कोई आवश्यकता नहीं है - आपके द्वारा बुलाया जाने वाला वर्ग NSScanner। इसका उपयोग इस प्रकार है:

NSString *originalString = @"(123) 123123 abc";
NSMutableString *strippedString = [NSMutableString 
        stringWithCapacity:originalString.length];

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet 
        characterSetWithCharactersInString:@"0123456789"];

while ([scanner isAtEnd] == NO) {
  NSString *buffer;
  if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
    [strippedString appendString:buffer];

  } else {
    [scanner setScanLocation:([scanner scanLocation] + 1)];
  }
}

NSLog(@"%@", strippedString); // "123123123"

संपादित करें: मैंने कोड अपडेट कर दिया है क्योंकि मूल मेरे सिर के ऊपर से लिखा गया था और मुझे लगा कि यह लोगों को सही दिशा में इंगित करने के लिए पर्याप्त होगा। ऐसा लगता है कि लोग कोड के बाद हैं वे सीधे अपने आवेदन में सीधे कॉपी-पेस्ट कर सकते हैं।

मैं यह भी मानता हूं कि माइकल पेल्ज़-शर्मन का समाधान उपयोग करने से अधिक उपयुक्त है NSScanner, इसलिए आप उस पर एक नज़र डालना चाहते हैं।


+1 अच्छा जवाब जो सीधे सवाल को संबोधित करता है। मैंने इस दृष्टिकोण की वकालत करने के लिए अपना उत्तर संपादित किया है, लेकिन मैं दूसरी छमाही को छोड़ रहा हूं, क्योंकि यह अभी भी सहायक है) जो प्रदर्शन के लिए फोन नंबर को प्रारूपित करने की फ्लिप-साइड समस्या को संबोधित करता है। (अगला, क्या आप एक रचनात्मक टिप्पणी छोड़ सकते हैं जब डाउनवोटिंग, केवल बाद के पाठकों के लिए?)
क्विन टेलर

4
यह जानना आसान हो सकता है कि NSCharacterSet का एक + दशमलवDigitCharacterSet तरीका है जो आपको सभी दशमलव अंक देगा। यह सेट नाथन सूचियों से थोड़ा अलग है, क्योंकि इसमें सभी प्रतीक शामिल हैं जो दशमलव संख्याओं का प्रतिनिधित्व करते हैं, उदाहरण के लिए, अरबी-इंडिक अंक (s आदि)। आपके आवेदन के आधार पर, यह कभी-कभी एक समस्या हो सकती है, लेकिन आम तौर पर या तो अच्छा या तटस्थ, और टाइप करने के लिए थोड़ा छोटा होता है।
रोब नेपियर

मुझे पूरा यकीन है कि यह जवाब वास्तव में काम नहीं करता है, और वास्तव में समस्या के लिए सही दृष्टिकोण नहीं है। यदि आप वास्तव में दिखाए गए कोड को आज़माते हैं (पहले NSLog में पहले एक @ जोड़ने से पहले, इसे एक objc स्ट्रिंग बनाते हुए), आप पाएंगे कि यह या तो प्रिंट करता है <null> या क्रैश। क्यों? नीचे मेरा जवाब देखें।
जैक न्यूटिंग

किसी अन्य उत्तर की आवश्यकता नहीं है - कि क्या टिप्पणियां हैं। मैंने माइकल पेज़-शर्मन के समाधान के संदर्भ सहित समाधान को अपडेट कर दिया है।
नाथन दे वीस

4
यह जटिल करने के लिए waaaay है।
राइस्ट

63

जो पूछा जा रहा है, उसके लिए स्वीकृत उत्तर ओवरकिल है। यह बहुत सरल है:

NSString *pureNumbers = [[phoneNumberString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];

2
(वर्तमान में) स्वीकृत उत्तर कमोबेश इसी के समान है, लेकिन 13 महीने पहले पोस्ट किया गया था।
कालेब

जब मैंने इसका उत्तर दिया, उस समय इसका उत्तर नहीं था। हालांकि ऐसा लगता है कि वर्तमान उत्तर पहले ही प्रस्तावित हो चुका था और मैं इससे चूक गया था: web.archive.org/web/20101115214033/http://stackoverflow.com/…
Yacine Filali

30

यह बहुत अच्छा है, लेकिन कोड मेरे लिए iPhone 3.0 एसडीके पर काम नहीं करता है।

अगर आप यहां दिखाए गए अनुसार स्ट्रिप्डस्ट्रिंग को परिभाषित करते हैं, तो मुझे कॉल के BAD ACCESS errorबाद इसे प्रिंट करने का प्रयास करने पर मिलता है scanCharactersFromSet:intoString

अगर मुझे यह पसंद है:

NSMutableString *strippedString = [NSMutableString stringWithCapacity:10];

मैं एक रिक्त स्ट्रिंग के साथ समाप्त होता हूं, लेकिन कोड क्रैश नहीं होता है।

मुझे इसके बजाय अच्छे पुराने C का सहारा लेना पड़ा:

for (int i=0; i<[phoneNumber length]; i++) {
    if (isdigit([phoneNumber characterAtIndex:i])) {
        [strippedString appendFormat:@"%c",[phoneNumber characterAtIndex:i]];
    }
}

मैं 3.0 चला रहा हूं और यह मेरे लिए काम करता है। Vries से अधिक लोकप्रिय जवाब काम नहीं किया।
Neo42

नंबर एक का जवाब मेरे काम नहीं आएगा। () (या - यह जवाब बहुत अच्छा काम करता है !! अच्छा पुराना सी !! साभार
जेफ

2
केवल ध्यान दें कि फोन नंबर के लिए '+' वर्ण की अनुमति दी जानी चाहिए।
१२:३१ पर प्रालसा

27

यद्यपि यह काम करने के उत्तर के साथ एक पुराना प्रश्न है, फिर भी मैं अंतर्राष्ट्रीय प्रारूप समर्थन से चूक गया । सिमोनोबो के समाधान के आधार पर, परिवर्तित चरित्र सेट में एक प्लस चिह्न "+" शामिल है। अंतर्राष्ट्रीय फोन नंबर इस संशोधन द्वारा समर्थित हैं।

NSString *condensedPhoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:
              [[NSCharacterSet characterSetWithCharactersInString:@"+0123456789"]
              invertedSet]] 
              componentsJoinedByString:@""];

स्विफ्ट के भाव हैं

var phoneNumber = " +1 (234) 567-1000 "
var allowedCharactersSet = NSMutableCharacterSet.decimalDigitCharacterSet()
allowedCharactersSet.addCharactersInString("+")
var condensedPhoneNumber = phoneNumber.componentsSeparatedByCharactersInSet(allowedCharactersSet.invertedSet).joinWithSeparator("")

जो आम अंतर्राष्ट्रीय फोन नंबर प्रारूप के रूप में +12345671000 की पैदावार देता है।


2
यह सूची में सबसे अच्छा समाधान है, खासकर यदि आपको अंतरराष्ट्रीय फोन नंबर के लिए प्लस चिह्न की आवश्यकता है।
UXUiOS

किसी कारण के लिए, एक उल्टे चरित्र सेट का उपयोग करने से मुझे डर लगता है जहाँ तक प्रदर्शन जाता है। क्या किसी को पता है कि क्या यह एक निराधार डर है?
devios1

यह एक काम किया! क्या आप इसके काम की व्याख्या कर सकते हैं? @alex
जयप्रकाश दुबे २

11

यहाँ इस का स्विफ्ट संस्करण है।

import UIKit
import Foundation
var phoneNumber = " 1 (888) 555-5551    "
var strippedPhoneNumber = "".join(phoneNumber.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))

स्विफ्ट 2.0: phoneNumber.computersSeparatedByCharactersInSet (NSCharacterSet.decimalDigitCharacterSet ()। InvertedSet) .joinWithSeparator ("")
iluvatar_GR

11

सबसे लोकप्रिय उत्तर का स्विफ्ट संस्करण:

var newString = join("", oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))

संपादित करें: स्विफ्ट 2 के लिए सिंटैक्स

let newString = oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")

संपादित करें: स्विफ्ट 3 के लिए सिंटैक्स

let newString = oldString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")

वहाँ दशमलव अलग प्रतीक रखने के लिए एक रास्ता है? डिवाइस की डिफ़ॉल्ट सेटिंग्स के एक फ़ंक्शन के रूप में डॉट (या अल्पविराम)? आपका समाधान सब कुछ खत्म कर देता है लेकिन संख्या
निकोलस

5

उदाहरण के लिए धन्यवाद। यह केवल एक ही चीज़ है स्कैन के अभाव में वृद्धि की स्थिति में मूलस्ट्रिंग में वर्णों में से एक वर्ण संख्या ऑब्जेक्ट के अंदर नहीं पाया जाता है। मैंने इसे ठीक करने के लिए एक और {} स्टेटमेंट जोड़ा है।

NSString *originalString = @"(123) 123123 abc";
NSMutableString *strippedString = [NSMutableString 
        stringWithCapacity:originalString.length];

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet 
        characterSetWithCharactersInString:@"0123456789"];

while ([scanner isAtEnd] == NO) {
  NSString *buffer;
  if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
    [strippedString appendString:buffer];
  }
  // --------- Add the following to get out of endless loop
  else {
     [scanner setScanLocation:([scanner scanLocation] + 1)];
  }    
  // --------- End of addition
}

NSLog(@"%@", strippedString); // "123123123"

4

यह केवल मोबाइल नंबर स्वीकार करता है

NSString * strippedNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [mobileNumber length])];

3

यह ध्यान देने योग्य हो सकता है कि स्वीकृत componentsSeparatedByCharactersInSet:और componentsJoinedByString:-बेड उत्तर स्मृति-कुशल समाधान नहीं है। यह वर्ण सेट के लिए, एक सरणी के लिए और एक नए स्ट्रिंग के लिए मेमोरी आवंटित करता है। यहां तक ​​कि अगर ये केवल अस्थायी आवंटन हैं, तो बहुत सारे तार प्रसंस्करण इस तरह से स्मृति को जल्दी से भर सकते हैं।

एक स्मृति मैत्री दृष्टिकोण दृष्टिकोण जगह में स्ट्रिंग की एक परस्पर प्रतिलिपि पर काम करना होगा। NSString पर एक श्रेणी में:

-(NSString *)stringWithNonDigitsRemoved {
    static NSCharacterSet *decimalDigits;
    if (!decimalDigits) {
        decimalDigits = [NSCharacterSet decimalDigitCharacterSet];
    }
    NSMutableString *stringWithNonDigitsRemoved = [self mutableCopy];
    for (CFIndex index = 0; index < stringWithNonDigitsRemoved.length; ++index) {
        unichar c = [stringWithNonDigitsRemoved characterAtIndex: index];
        if (![decimalDigits characterIsMember: c]) {
            [stringWithNonDigitsRemoved deleteCharactersInRange: NSMakeRange(index, 1)];
            index -= 1;
        }
    }
    return [stringWithNonDigitsRemoved copy];
}

दो दृष्टिकोणों को प्रोफाइल करते हुए यह लगभग 2/3 कम मेमोरी का उपयोग करके दिखाया गया है।


2

आप परिवर्तनशील स्ट्रिंग पर नियमित अभिव्यक्ति का उपयोग कर सकते हैं:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:
                                @"[^\\d]"
                                options:0
                                error:nil];

[regex replaceMatchesInString:str
                      options:0 
                        range:NSMakeRange(0, str.length) 
                 withTemplate:@""];

1

व्यापक समस्याओं के साथ मदद करने के लिए एक श्रेणी के रूप में शीर्ष समाधान बनाया:

इंटरफेस:

@interface NSString (easyReplace)
- (NSString *)stringByReplacingCharactersNotInSet:(NSCharacterSet *)set 
                                             with:(NSString *)string;
@end

implemenation:

@implementation NSString (easyReplace)
- (NSString *)stringByReplacingCharactersNotInSet:(NSCharacterSet *)set 
                                             with:(NSString *)string
{
    NSMutableString *strippedString = [NSMutableString
                                       stringWithCapacity:self.length];

    NSScanner *scanner = [NSScanner scannerWithString:self];

    while ([scanner isAtEnd] == NO) {
        NSString *buffer;
        if ([scanner scanCharactersFromSet:set intoString:&buffer]) {
            [strippedString appendString:buffer];
        } else {
            [scanner setScanLocation:([scanner scanLocation] + 1)];
            [strippedString appendString:string];
        }
    }
    return [NSString stringWithString:strippedString];
}
@end

उपयोग:

NSString *strippedString = 
 [originalString stringByReplacingCharactersNotInSet:
   [NSCharacterSet setWithCharactersInString:@"01234567890" 
                                        with:@""];

1

स्विफ्ट 3

let notNumberCharacters = NSCharacterSet.decimalDigits.inverted
let intString = yourString.trimmingCharacters(in: notNumberCharacters)

यह केवल शुरुआत और अंत से गैर अंक वर्णों को ट्रिम करेगा।
शबुका

1

तेजी से 4.1

var str = "75003 Paris, France"
var stringWithoutDigit = (str.components(separatedBy:CharacterSet.decimalDigits)).joined(separator: "")
print(stringWithoutDigit)

0

उम। पहला उत्तर मुझे पूरी तरह से गलत लगता है। NSScanner वास्तव में पार्सिंग के लिए है। रेगेक्स के विपरीत, यह आपके पास एक समय में एक छोटे से स्ट्रिंग स्ट्रिंग को पार्स कर रहा है। आप इसे एक स्ट्रिंग के साथ आरंभीकृत करते हैं, और यह इस बात का सूचकांक बनाए रखता है कि स्ट्रिंग कितनी दूर है; वह सूचकांक हमेशा उसका संदर्भ बिंदु होता है, और आपके द्वारा दिया गया कोई भी आदेश उस बिंदु के सापेक्ष होता है। आप इसे कहते हैं, "ठीक है, मुझे इस सेट में वर्णों का अगला हिस्सा दें" या "मुझे स्ट्रिंग में आपको मिलने वाला पूर्णांक दें", और वे वर्तमान सूचकांक में शुरू करते हैं, और तब तक आगे बढ़ते हैं जब तक कि उन्हें कुछ ऐसा नहीं मिल जाता है मेल खाते हैं। यदि पहले ही वर्ण पहले से मेल नहीं खाता है, तो विधि NO लौटाती है, और अनुक्रमणिका बढ़ती नहीं है।

पहले उदाहरण में कोड दशमलव वर्णों के लिए "(123) 456-7890" स्कैन कर रहा है, जो पहले से ही पहले चरित्र से विफल हो जाता है, इसलिए स्कैनच्रेक्टर्सफ्रॉम से कॉल करने के लिए फ़ॉरसेट: नक्षत्र: पास-इन स्ट्रिप्ड स्ट्रिप्ड को अकेला छोड़ देता है और NO; कोड पूरी तरह से अनदेखा करता है वापसी मूल्य की जाँच करते हुए, छीन लिया गया बिना छेड़े। यहां तक ​​कि अगर पहला वर्ण एक अंक था, तो वह कोड विफल हो जाएगा, क्योंकि यह केवल पहले डैश या पैरेन या जो भी हो, तब तक प्राप्त अंकों को वापस कर देगा।

यदि आप वास्तव में NSScanner का उपयोग करना चाहते हैं, तो आप लूप में कुछ ऐसा डाल सकते हैं, और NO रिटर्न वैल्यू के लिए जाँच करते रह सकते हैं, और यदि आपको ऐसा लगता है कि आप स्कैन लेक्चर को बढ़ा सकते हैं और फिर से स्कैन कर सकते हैं; और आपको isAtEnd और yada yada yada को भी जांचना होगा। संक्षेप में, नौकरी के लिए गलत उपकरण। माइकल का समाधान बेहतर है।


0

फोन निष्कर्षण की खोज करने वालों के लिए, आप उदाहरण के लिए, NSDataDetector का उपयोग करके किसी फ़ोन से फ़ोन नंबर निकाल सकते हैं:

NSString *userBody = @"This is a text with 30612312232 my phone";
if (userBody != nil) {
    NSError *error = NULL;
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber error:&error];
    NSArray *matches = [detector matchesInString:userBody options:0 range:NSMakeRange(0, [userBody length])];
    if (matches != nil) {
        for (NSTextCheckingResult *match in matches) {
            if ([match resultType] == NSTextCheckingTypePhoneNumber) {
                DbgLog(@"Found phone number %@", [match phoneNumber]);
            }
        }
    }
}

`


0

मैंने इस सामान्य ऑपरेशन को सरल बनाने के लिए NSString पर एक श्रेणी बनाई।

NSString + AllowCharactersInSet.h

@interface NSString (AllowCharactersInSet)

- (NSString *)stringByAllowingOnlyCharactersInSet:(NSCharacterSet *)characterSet;

@end

NSString + AllowCharactersInSet.m

@implementation NSString (AllowCharactersInSet)

- (NSString *)stringByAllowingOnlyCharactersInSet:(NSCharacterSet *)characterSet {
    NSMutableString *strippedString = [NSMutableString
                                   stringWithCapacity:self.length];

    NSScanner *scanner = [NSScanner scannerWithString:self];

    while (!scanner.isAtEnd) {
        NSString *buffer = nil;

        if ([scanner scanCharactersFromSet:characterSet intoString:&buffer]) {
            [strippedString appendString:buffer];
        } else {
            scanner.scanLocation = scanner.scanLocation + 1;
        }
    }

    return strippedString;
}

@end

0

मुझे लगता है कि वर्तमान में सबसे अच्छा तरीका है:

phoneNumber.replacingOccurrences(of: "\\D",
                               with: "",
                            options: String.CompareOptions.regularExpression)

0

यदि आप केवल स्ट्रिंग से संख्याओं को पकड़ना चाहते हैं, तो आप निश्चित रूप से उन्हें बाहर निकालने के लिए नियमित अभिव्यक्तियों का उपयोग कर सकते हैं। Objective-C में regex करने के लिए, RegexKit देखें संपादित करें: जैसा कि @Nathan बताते हैं, NSScanner का उपयोग करना एक स्ट्रिंग से सभी नंबरों को पार्स करने का एक बहुत सरल तरीका है। मुझे उस विकल्प के बारे में पूरी जानकारी नहीं थी, इसलिए उसे सुझाव देने के लिए उसे सहारा दिया। (मैं खुद भी रेगेक्स का उपयोग करना पसंद नहीं करता, इसलिए मैं उन तरीकों को पसंद करता हूं जिनके लिए उन्हें आवश्यकता नहीं है।

यदि आप प्रदर्शन के लिए फ़ोन नंबर प्रारूपित करना चाहते हैं, तो यह NSNumberFormatter पर एक नज़र डालने के लायक है । मेरा सुझाव है कि ऐसा करने के सुझावों के लिए आप इस संबंधित SO प्रश्न को पढ़ें । याद रखें कि फोन नंबर स्थान और / या स्थान के आधार पर अलग-अलग स्वरूपित किए गए हैं।


ओह दर्दनाक घंटे मैंने अच्छे फोन नंबर फॉर्मेटर्स और पार्सर विकसित करने में बिताए हैं। लिंक किए गए धागे एक अच्छी शुरुआत है, लेकिन प्रदर्शन के लिए वैश्विक फोन नंबरों को प्रारूपित करने का सामान्य मामला एक लंबी सड़क है, और जैसा कि लिंक किए गए थ्रेड्स में उल्लेख किया गया है, ऐप्पल आपको एड्रेस बुक फोन नंबर फॉर्मेटर्स तक कोई पहुंच नहीं देता है, और हैं पता पुस्तिका API से फ़ोन नंबर कैसे प्रस्तुत किए जाते हैं, इस पर बहुत असंगत। प्रदर्शन के लिए फ़ोन नंबर को फ़ॉर्मेट करने से कठिन केवल यह निर्धारित करना है कि क्या दो फ़ोन नंबर समान हैं। कम से कम ओपी का सवाल समस्याओं में सबसे आसान है।
रोब नेपियर

मेरा मानना ​​है कि जब तक आप एक आदिम, यूएस-केंद्रित कार्यान्वयन से खुश नहीं होते हैं, तब तक फोन नंबर को प्रारूपित करने वाले लिंक भ्रामक होते हैं। ऐप्पल से एक उचित स्थानीय फोन नंबर फॉर्मेटर के बदले में, यह ठीक से करने का एकमात्र तरीका डिवाइस से फ़ॉर्मेटिंग टेम्प्लेट (ओएस 2.x में UIPhoneFormats.plist) की नकल करना है और उपयोगकर्ताओं के लोकेल के आधार पर स्वयं टेम्पलेट को पुन: उत्पन्न करना है। यह एक गैर-तुच्छ कार्य है।
नाथन डे वीस

इसलिए मैंने संख्या स्वरूपकों के स्थानीयकरण का उल्लेख किया। मैंने इसके लिए पूर्ण समाधान के किसी भी रूप को पोस्ट करने का दिखावा नहीं किया - यह एक बहुत लंबी चर्चा है और इसे एक अलग एसओ प्रश्न बनाने के लिए अधिक समझ में आएगा।
क्विन टेलर


-1

जॉन वोगेल के उत्तर के आधार पर यह कुछ बुनियादी परीक्षणों के साथ स्विफ्ट स्ट्रिंग विस्तार के रूप में है।

import Foundation
extension String {
    func stringByRemovingNonNumericCharacters() -> String {
        return self.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")
    }
}

और कम से कम बुनियादी कार्यक्षमता साबित करने वाले कुछ परीक्षण:

import XCTest

class StringExtensionTests: XCTestCase {

    func testStringByRemovingNonNumericCharacters() {

        let baseString = "123"
        var testString = baseString
        var newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString == testString)

        testString = "a123b"
        newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString == baseString)

        testString = "a=1-2_3@b"
        newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString == baseString)

        testString = "(999) 999-9999"
        newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString.characters.count == 10)
        XCTAssertTrue(newString == "9999999999")

        testString = "abc"
        newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString == "")
    }
}

यह ओपी के सवाल का जवाब देता है, लेकिन इसे फोन नंबर से संबंधित पात्रों जैसे "; * # +" में छोड़ने के लिए आसानी से संशोधित किया जा सकता है;


-4
NSString *originalPhoneNumber = @"(123) 123-456 abc";
NSCharacterSet *numbers = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
NSString *trimmedPhoneNumber = [originalPhoneNumber stringByTrimmingCharactersInSet:numbers];

];

इसे सरल रखें!


3
यह केवल शुरुआत और अंत से उन पात्रों को ट्रिम करेगा।
छापा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.