2010-09-27 12 views
6

¿Hay alguna manera mejor o más corta de desglosar todos los caracteres que no sean dígitos con Objective-C en el iPhone?¿Cuál es una buena manera de eliminar el formato de un número de teléfono para obtener solo los dígitos?

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

Tenga en cuenta que los dígitos que no son como '+' son válidos en los números de teléfono. –

+0

Los números de teléfono solo deben * comenzar * con un +, de acuerdo con [UIT-T E.123] (http://www.itu.int/rec/T-REC-E.123-200102-I/es). – dreamlax

+0

Eso es cierto, pero necesito obtener el número en un tipo entero. Debería haber incluido eso en el detalle de la pregunta. – Mack

Respuesta

4

Se podría utilizar una expresión regular de reemplazo que reemplaza [\D] sin nada.

0

se podría hacer algo como esto:

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

Observando el comentario de 0xA3 anterior, se puede usar opcionalmente una NSCharacterSet diferente que incluye + y otros no-dígitos que son válidos en los números de teléfono.

3

Dupe de Remove all but numbers from NSString

La respuesta aceptada no implica el uso de NSScanner, que parece de mano dura para una tarea tan sencilla. Me quedo con lo que tienes ahí (si alguien en el otro hilo sugirió una versión más compacta si, por lo tanto:

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

Gracias. Sí, me preguntaba si la declaración if estaba agregando algún valor. – Mack

3

números de teléfono pueden contener asteriscos y signos de número (* y #), y puede comenzar con un +. el ITU-T E-123 Recommandation recomienda que el símbolo + se utiliza para indicar que el número es un número internacional y también para servir como un recordatorio de que la secuencia de marcación internacional específica de cada país debe ser utilizado en lugar de ella.

Espacios , los guiones y los paréntesis no se pueden marcar, por lo que no tienen ningún significado en un número de teléfono. Para quitar todos los símbolos inútiles, debe eliminar todos los caracteres no en el conjunto de caracteres decimales, excepto * y #, y también cualquier + no encontrado al comienzo del número de teléfono.

Que yo sepa, no existe una forma estandarizada o recomendada para representar extensiones manuales (algún uso x, algunos utilizan ext, algunos utilizan E). Aunque no he encontrado una extensión manual en mucho tiempo.

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]; 
Cuestiones relacionadas