ลบทั้งหมดยกเว้นตัวเลขจาก NSString


157

ฉันมี NSString (หมายเลขโทรศัพท์) ที่มีวงเล็บและยัติภังค์เพราะมีการจัดรูปแบบหมายเลขโทรศัพท์ ฉันจะลบอักขระทั้งหมดยกเว้นตัวเลขออกจากสตริงได้อย่างไร

คำตอบ:


375

คำถามเก่า แต่เรื่อง:

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

มันจะระเบิดสตริงต้นทางในชุดที่ไม่ใช่ตัวเลขจากนั้นประกอบอีกครั้งโดยใช้ตัวคั่นสตริงที่ว่างเปล่า ไม่มีประสิทธิภาพเท่ากับการเลือกผ่านตัวอักษร แต่มีขนาดกะทัดรัดกว่าในโค้ด


6
ขอบคุณ! สำหรับผู้เริ่มต้นคนอื่น ๆ คุณสามารถสร้าง NSCharacterSet ของคุณเองได้โดยทำNSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
guptron

1
ขอบคุณมาก! แค่อยากรู้อยากเห็นของฉันคุณมีความคิดว่าทำไมมันNSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]ไม่ทำงาน?
Thomas Besnehard

1
@Tommecpe stringByTrimmingCharactersInSet จะลบเฉพาะจากจุดเริ่มต้นและจุดสิ้นสุดของสตริงดังนั้นจึงไม่มีผลต่อหลังจากอักขระที่ไม่ตรงกันตัวแรกหรือก่อนอักขระที่ไม่ตรงกัน
simonobo

ฉันต้องการเก็บเฉพาะตัวเลขและตัวอักษรฉันจะทำอย่างไร
Jacky

1
@Jacky ในตัวอย่างด้านบนคุณจะแทนที่[NSCharacterSet decimalDigitCharacterSet]ด้วยอันที่มีตัวเลขและตัวอักษรเท่านั้น คุณสามารถสร้างหนึ่งโดยการสร้างNSMutableCharaterSetและผ่านdecimalDigitCharacterSet, uppercaseLetterCharacterSetและการlowercaseLetterCharacterSet formUnionWithCharacterSet:โปรดทราบว่าletterCharacterSetมีเครื่องหมายเช่นกันดังนั้นการใช้เวอร์ชันที่ต่ำกว่าและตัวพิมพ์ใหญ่
kadam

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"

แก้ไข:ฉันได้อัปเดตรหัสเพราะต้นฉบับถูกเขียนออกมาจากด้านบนของหัวของฉันและฉันคิดว่ามันจะเพียงพอที่จะชี้คนในทิศทางที่ถูกต้อง ดูเหมือนว่าคนที่อยู่หลังรหัสพวกเขาสามารถคัดลอกวางลงในใบสมัครของพวกเขาโดยตรง

ฉันยอมรับด้วยว่าโซลูชันของ Michael Pelz-Sherman นั้นเหมาะสมกว่าการใช้NSScannerดังนั้นคุณอาจต้องการดูสิ่งนั้น


+1 คำตอบที่ดีที่ตอบคำถามโดยตรง ฉันได้แก้ไขคำตอบของฉันเพื่อสนับสนุนวิธีการนี้ แต่ฉันออกไปครึ่งหลังตามที่เป็นอยู่เพราะมันยังมีประโยชน์) ซึ่งแก้ปัญหาพลิกด้านของการจัดรูปแบบหมายเลขโทรศัพท์เพื่อแสดง (ถัดไปคุณสามารถแสดงความคิดเห็นที่สร้างสรรค์เมื่อ downvoting ถ้าเพียง แต่สำหรับผู้อ่านภายหลังได้หรือไม่)
ควินน์เทย์เลอร์

4
มันอาจจะสะดวกที่จะรู้ว่ามีวิธีการ + decimalDigitCharacterSet ของ NSCharacterSet ที่จะให้ตัวเลขทศนิยมทั้งหมดแก่คุณ สิ่งนี้แตกต่างจากรายการชุดนาธานเล็กน้อยเนื่องจากมีสัญลักษณ์ทั้งหมดที่แสดงถึงเลขทศนิยมรวมถึงตัวอย่างเช่นตัวเลขอารบิก - อารบิก (١٢٣٤٥ ฯลฯ ) ขึ้นอยู่กับแอปพลิเคชันของคุณซึ่งบางครั้งอาจมีปัญหา แต่โดยทั่วไปแล้วอาจเป็นปัญหาที่ดีหรือเป็นกลางและสั้นกว่าเล็กน้อยในการพิมพ์
Rob Napier

ฉันค่อนข้างมั่นใจว่าคำตอบนี้ใช้งานไม่ได้จริง ๆ และไม่ใช่วิธีการที่เหมาะสมในการแก้ไขปัญหา หากคุณลองใช้รหัสตามที่แสดงจริง (ก่อนเพิ่ม @ ก่อนพารามิเตอร์แรกใน NSLog ทำให้เป็นสตริง objc) คุณจะพบว่ามันพิมพ์ <null> หรือขัดข้อง ทำไม? ดูคำตอบของฉันด้านล่าง
แจ็ค Nutting

ไม่จำเป็นต้องมีคำตอบอื่น - นั่นคือความคิดเห็น ฉันได้อัปเดตโซลูชันแล้วรวมถึงการอ้างอิงถึงโซลูชันของ Michael Pelz-Sherman
Nathan de Vries

4
นั่นเป็นเรื่องที่ซับซ้อน
ryyst

63

คำตอบที่ยอมรับคือ overkill สำหรับสิ่งที่ถูกถาม ง่ายกว่านี้มาก:

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

2
คำตอบที่ยอมรับ (ปัจจุบัน) นั้นเหมือนกันกับคำตอบนี้มาก แต่น้อยกว่า 13 เดือนที่ผ่านมา
คาเลบ

ตอนที่ฉันตอบคำถามนี้มันไม่มีคำตอบนี้ แม้ว่าดูเหมือนว่าคำตอบปัจจุบันจะได้รับการเสนอแล้วและฉันก็พลาดไป: web.archive.org/web/20101115214033/http://stackoverflow.com/…
Yacine Filali

30

เป็นสิ่งที่ดี แต่รหัสไม่ทำงานสำหรับฉันใน iPhone 3.0 SDK

ถ้าฉันกำหนด strippedString ตามที่คุณแสดงที่นี่ฉันจะได้รับBAD ACCESS errorเมื่อพยายามพิมพ์หลังจากscanCharactersFromSet:intoStringโทร

ถ้าฉันทำเช่นนั้น:

NSMutableString *strippedString = [NSMutableString stringWithCapacity:10];

ฉันท้ายด้วยสตริงว่างเปล่า แต่รหัสไม่ผิดพลาด

ฉันต้องหันไปหาซีเก่าดีแทน:

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

ฉันใช้ 3.0 และมันใช้งานได้สำหรับฉัน คำตอบยอดนิยมจาก Vries ไม่ทำงาน
Neo42

คำตอบหมายเลขหนึ่งจะไม่ทำงานสำหรับฉัน เครื่องสแกนหยุดเมื่อถึง () หรือ - คำตอบนี้ใช้ได้ดี !! ดี C เก่า !! ขอบคุณ
Jeff

2
โปรดทราบว่าควรใช้อักขระ '+' สำหรับหมายเลขโทรศัพท์
Prcela

27

แต่นี้เป็นคำถามเดิมกับคำตอบที่ทำงานผมพลาดการสนับสนุนรูปแบบสากล ขึ้นอยู่กับการแก้ปัญหาของ simonobo ชุดอักขระที่เปลี่ยนแปลงประกอบด้วยเครื่องหมายบวก "+" หมายเลขโทรศัพท์ระหว่างประเทศได้รับการสนับสนุนโดยการแก้ไขนี้เช่นกัน

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 @
Jayprakash Dubey

11

นี่คือเวอร์ชั่น Swift ของสิ่งนี้

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

Swift 2.0: phoneNumber.componentsSeparatedByCharactersInSet (NSCharacterSet.decimalDigitCharacterSet (). invertedSet) .joinWithSeparator ("")
iluvatar_GR

11

คำตอบที่ได้รับความนิยมมากที่สุด:

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

แก้ไข: ไวยากรณ์สำหรับ Swift 2

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

แก้ไข: ไวยากรณ์สำหรับ Swift 3

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

มีวิธีเก็บสัญลักษณ์แยกทศนิยมหรือไม่? จุด (หรือเครื่องหมายจุลภาค) เป็นฟังก์ชันของการตั้งค่าเริ่มต้นของอุปกรณ์หรือไม่ วิธีแก้ปัญหาของคุณกำจัดทุกอย่างยกเว้นตัวเลข
นิโคลัส

5

ขอบคุณสำหรับตัวอย่าง มีเพียงสิ่งเดียวที่ขาดการเพิ่มขึ้นของ scanLocation ในกรณีที่ไม่พบอักขระตัวใดตัวหนึ่งใน originalString ภายในวัตถุหมายเลข CharacterSet ฉันได้เพิ่มคำสั่งอื่น {} เพื่อแก้ไขปัญหานี้

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)

การทำเช่นนี้จะตัดเฉพาะอักขระที่ไม่ใช่ตัวเลขตั้งแต่เริ่มต้นและสิ้นสุด
Shebuka

1

รวดเร็ว 4.1

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

0

หนอ คำตอบแรกดูเหมือนผิดทั้งหมดสำหรับฉัน NSScanner มีความหมายจริงๆสำหรับการแยกวิเคราะห์ ไม่เหมือนกับ regex คุณแยกวิเคราะห์สตริงทีละน้อย ๆ คุณเริ่มต้นมันด้วยสตริงและมันจะเก็บดัชนีว่าระยะทางของสตริงนั้นยาวแค่ไหน ดัชนีนั้นเป็นจุดอ้างอิงเสมอและคำสั่งใด ๆ ที่คุณให้มานั้นจะสัมพันธ์กับจุดนั้น คุณบอกมันว่า "โอเคให้ฉันดูตัวละครต่อไปในชุดนี้" หรือ "ให้จำนวนเต็มที่คุณเจอในสตริง" และเริ่มจากดัชนีปัจจุบันแล้วไปข้างหน้าจนกว่าพวกเขาจะพบสิ่งที่ไม่ การจับคู่. หากอักขระตัวแรกที่ไม่ตรงกันแล้วเมธอดจะส่งคืน NO และดัชนีจะไม่เพิ่มขึ้น

โค้ดในตัวอย่างแรกคือการสแกน "(123) 456-7890" สำหรับอักขระทศนิยมซึ่งล้มเหลวจากอักขระตัวแรกดังนั้นการเรียกใช้ scanCharactersFromSet: intoString: จะทำให้การลอกผ่านสตริงเป็นแบบแยกและส่งคืน NO; รหัสไม่สนใจการตรวจสอบค่าส่งคืนทั้งหมดทำให้ strippedString ไม่ถูกมอบหมาย แม้ว่าตัวอักษรตัวแรกจะเป็นตัวเลข แต่รหัสนั้นก็จะล้มเหลวเพราะมันจะคืนค่าตัวเลขที่พบจนกระทั่งตัวแรกหรือตัวย่อหรืออะไรก็ตาม

หากคุณต้องการใช้ NSScanner จริงๆคุณสามารถใส่สิ่งนั้นลงในลูปและทำการตรวจสอบค่า NO return และถ้าคุณได้รับสิ่งนั้นคุณสามารถเพิ่มตำแหน่งสแกนและสแกนอีกครั้ง และคุณต้องตรวจสอบ 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

หากคุณเพียงแค่ต้องการจับตัวเลขจากสตริงคุณสามารถใช้การแสดงผลปกติเพื่อแยกพวกเขาออก สำหรับการทำ regex ใน Objective-C, ตรวจสอบRegexKit แก้ไข: ตามที่ @Nathan ชี้ให้เห็นการใช้ NSScanner เป็นวิธีที่ง่ายกว่ามากในการวิเคราะห์ตัวเลขทั้งหมดจากสตริง ฉันไม่รู้ตัวเลือกทั้งหมดเลยดังนั้นอุปกรณ์สำหรับเขาที่แนะนำมัน (ฉันไม่ชอบใช้ regex ด้วยตัวเองดังนั้นฉันจึงชอบวิธีที่ไม่ต้องการใช้)

หากคุณต้องการจัดรูปแบบหมายเลขโทรศัพท์สำหรับการแสดงผลของมันคุ้มค่าการดูที่NSNumberFormatter ฉันขอแนะนำให้คุณอ่านคำถาม SO ที่เกี่ยวข้องสำหรับคำแนะนำในการทำเช่นนี้ โปรดจำไว้ว่าหมายเลขโทรศัพท์มีรูปแบบแตกต่างกันไปตามตำแหน่งและ / หรือสถานที่


โอ้เวลาอันเจ็บปวดฉันได้ใช้เวลาพัฒนารูปแบบหมายเลขโทรศัพท์และตัวแยกวิเคราะห์ที่ดี เธรดที่เชื่อมโยงเป็นการเริ่มต้นที่ดี แต่กรณีทั่วไปของการจัดรูปแบบหมายเลขโทรศัพท์ทั่วโลกสำหรับการแสดงผลเป็นเส้นทางยาวและตามที่ระบุไว้ในเธรดที่เชื่อมโยง Apple ไม่อนุญาตให้คุณเข้าถึงตัวจัดรูปแบบหมายเลขโทรศัพท์ของสมุดที่อยู่ ไม่สอดคล้องกันมากในการนำเสนอหมายเลขโทรศัพท์จาก Address Book API สิ่งเดียวที่ยากกว่าการจัดรูปแบบหมายเลขโทรศัพท์สำหรับการแสดงผลคือการพิจารณาว่าหมายเลขโทรศัพท์สองหมายเลขเท่ากันหรือไม่ อย่างน้อยคำถามของ OP คือปัญหาที่ง่ายที่สุด
Rob Napier

ฉันเชื่อว่าลิงก์เหล่านั้นในการจัดรูปแบบหมายเลขโทรศัพท์นั้นทำให้เข้าใจผิดเว้นแต่คุณจะพอใจกับการใช้งานแบบดั้งเดิมและเป็นศูนย์กลางของสหรัฐอเมริกา แทนที่จะใช้ฟอร์แมตหมายเลขโทรศัพท์ที่ถูกแปลจาก Apple วิธีเดียวที่จะทำได้คือคัดลอกเทมเพลตการจัดรูปแบบจากอุปกรณ์ (UIPhoneFormats.plist ใน OS 2.x) และสร้างแม่แบบขึ้นอยู่กับสถานที่ของผู้ใช้ นี่เป็นงานที่ไม่สำคัญ
Nathan de Vries

นั่นเป็นเหตุผลที่ฉันพูดถึงการแปลของตัวจัดรูปแบบตัวเลข ฉันไม่ได้แกล้งทำเป็นโพสต์รูปแบบใดของโซลูชันที่สมบูรณ์แบบ - เป็นการสนทนาที่ยาวกว่ามาก
Quinn Taylor


-1

จากคำตอบของ Jon Vogel ตรงนี้มันเป็นส่วนเสริมของ Swift String พร้อมกับการทดสอบพื้นฐานบางอย่าง

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 == "")
    }
}

นี่เป็นการตอบคำถามของ OP แต่สามารถแก้ไขได้ง่ายเพื่อให้อยู่ในอักขระที่เกี่ยวข้องกับหมายเลขโทรศัพท์เช่น ",; * # +"


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

];

ง่าย ๆ เข้าไว้!


3
สิ่งนี้จะตัดเฉพาะอักขระเหล่านั้นตั้งแต่เริ่มต้นและสิ้นสุด
raidfive
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.