在我的应用程序中,我试图检索联系人号码列表并尝试对它们进行操作。我意识到,每当我添加新联系人(更新到 iOS 7 后)时,新联系人的格式都会发生变化,因为新添加的数字中有间距。
使用普通替换方法不会删除空格。
这些真的是空间还是这些是什么?我的目标是取回“空间”免费号码。
例如,如果数字是1 818 323 323 323
,我想得到1818323323323
我认为这并没有摆脱“空格”,而是只剩下十进制字符。这段代码为我做到了:
phoneNumberString = [[phoneNumberString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
这去掉了所有不是数字 0-9 的东西。
斯威夫特 4.1:
phoneNumberString = phoneNumberString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
尝试这个:
NSString *cleaned = [[phoneNr componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
这应该适用于任何类型的空间(其中有很多)。这似乎有些低效,但对于电话号码,这应该没问题。
一些 iOS7 电话号码使用不间断空格进行编码。尝试这个:
NSString* stringFormatted = [phoneNumber stringByReplacingOccurrencesOfString:@"\u00a0" withString:@""];
经过太多的字符串清理后,我终于在直接从通讯簿打印 CFStringRef 后找到了答案。这是幕后发生的事情......
要删除 \U00A0 我尝试了 3 个来自该线程的答案和 [NSCharacterSet characterSetWithRange:(160,1)] 没有工作。最终起作用的是这行代码:
phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@"." withString:@""];
// 在哪里 @”。” 是通过键入 Option+空格键创建的
另一个(非常灵活的)选项是使用正则表达式。这允许您保留 + 或您想要保留的任何其他字符。
let numberFromAddressBook = "+1 818 323 323 323"
let cleanNumber = numberFromAddressBook.stringByReplacingOccurrencesOfString("[^0-9+]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil)
"+1818323323323"
我在我的应用程序中使用的最干净的解决方案是:
NSMutableCharacterSet *phoneNubmerCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"+"];
[phoneNubmerCharacterSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
NSString* phoneString = [[phoneString componentsSeparatedByCharactersInSet:[phoneNubmerCharacterSet invertedSet]] componentsJoinedByString:@""];
没有“if”逻辑,保留 + 号,删除所有类型的随机不需要的字符
我对发帖人的回答做了一个小的调整,以防有人想在数字的开头保持 +。
如果您想在删除空格后保留加号,我做了这个小调整。
Boolean shouldAddPlus = NO;
if([[phoneNumber substringToIndex:1] isEqualToString:@"+"])
{
shouldAddPlus = YES;
}
phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
if(shouldAddPlus)
phoneNumber = [base stringByAppendingString:phoneNumber];
正确的解决方案是用有效空格替换出现
NSString *clean = [dirty stringByReplacingOccurrencesOfString:@"\u00a0" withString:@" "];
所以你不会失去空间,用户会看到其他应用程序中看到的内容。