2010-09-27 14 views
6

Czy istnieje lepszy lub krótszy sposób na pozbycie się wszystkich niecyfrowych znaków za pomocą Objective-C na iPhonie?Jaki jest dobry sposób na usunięcie formatowania z numeru telefonu, aby uzyskać tylko cyfry?

NSString * formattedNumber = @"(123) 555-1234"; 
NSCharacterSet * nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; 

NSString * digits; 
NSArray * parts = [formattedNumber componentsSeparatedByCharactersInSet:nonDigits]; 
if ([parts count] > 1) { 
    digits = [parts componentsJoinedByString:@""]; 
} else { 
    digits = [parts objectAtIndex:0]; 
} 
return digits; 
+1

Należy pamiętać, że cyfry takie jak "+" są niedozwolone w numerach telefonów. –

+0

Numery telefonów powinny * zaczynać się * od znaku +, zgodnie z [ITU-T E.123] (http://www.itu.int/rec/T-REC-E.123-200102-I/en). – dreamlax

+0

To prawda, ale muszę uzyskać numer w typie całkowitoliczbowym. Powinienem to uwzględnić w szczegółach pytania. – Mack

Odpowiedz

4

Można użyć zamiennika RegEx, który zastępuje [\D] bez niczego.

0

Można zrobić coś takiego:

NSString *digits = [[formattedNumber componentsSeparatedByCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]] componentsJoinedByString:@""]; 

Stwierdzając komentarz 0xA3 w powyżej, można ewentualnie użyć innego NSCharacterSet który zawiera + a także innych cyfr, które obowiązują w numerów.

3

Dupe od Remove all but numbers from NSString

Zaakceptowanych odpowiedź nie polega na wykorzystaniu NSScanner, co wydaje się brutalne dla tak prostego zadania. będę trzymać się tego, co masz tam (choć ktoś w innym wątku zaproponował bardziej kompaktową wersję Jeśli tak, w ten sposób:

NSString *digits = [[formattedNumber componentsSeparatedByCharactersInSet: 
         [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
         componentsJoinedByString:@""]; 
+0

Dzięki. Tak, zastanawiałem się, czy instrukcja if dodaje jakąkolwiek wartość. – Mack

3

numery telefonów mogą zawierać gwiazdki i znaki numeryczne (* i #) i może zacząć z +. na ITU-T E-123 Recommandation zaleca + symbol jest używany do wskazania, że ​​liczba jest liczbą międzynarodowej, a także służyć jako przypomnienie, że międzynarodowy kolejność wybierania danego kraju musi być stosowany zamiast niego.

Spaces , łączniki i nawiasy nie mogą być wybierane, więc nie mają żadnego znaczenia w numerze telefonu aby usunąć wszystkie niepotrzebne symbole, należy usunąć wszystkie znaki nie w zestawie znaków dziesiętnych, z wyjątkiem * i #, a także wszelkich + nie znaleziono na początku numeru telefonu.

Według mojej wiedzy nie ma znormalizowanego ani zalecanego sposobu reprezentowania rozszerzeń ręcznych (niektóre używają x, niektóre używają ext, niektóre używają E). Chociaż od dłuższego czasu nie spotkałem się z ręcznym rozszerzeniem.

NSUInteger inLength, outLength, i; 
NSString *formatted = @"(123) 555-5555"; 

inLength = [formatted length]; 
unichar result[inLength]; 

for (i = 0, outLength = 0; i < inLength; i++) 
{ 
    unichar thisChar = [formatted characterAtIndex:i]; 

    if (iswdigit(thisChar) || thisChar == '*' || thisChar == '#') 
     result[outLength++] = thisChar; // diallable number or symbol 
    else if (i == 0 && thisChar == '+') 
     result[outLength++] = thisChar; // international prefix 
} 

NSString *stripped = [NSString stringWithCharacters:result length:outLength]; 
Powiązane problemy