iOS 7联系人号码没有空格

11

在我的应用程序中,我试图检索联系人号码列表并对它们进行操作。我发现,每当我添加新联系人(升级到iOS 7后),新联系人的格式已经改变,因为新增的数字中有空格。

使用普通的替换方法无法去除这些空格。

这些是真正的空格还是什么?我的目标是获得不带空格的电话号码。

例如,如果号码是1 818 323 323 323,我想要得到1818323323323


1
什么是“普通替换方法”? - mrueg
@mrueg 可能是标准的 NSString stringByReplacing* 方法。 - self.name
8个回答

19

我认为这不仅仅是除去“空格”,而是只留下十进制字符。这段代码对我来说做到了这一点:

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

这将取出除数字0-9以外的所有内容。

Swift 4.1:

phoneNumberString = phoneNumberString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")

太棒了,这对我有用。但是,如果您想保留加号,您需要对其应用一些逻辑。 - Omar Sultan
太棒了!这个完美地运行了。非常感谢你:D - Mohsin Khubaib Ahmed

8

试试这个:

NSString *cleaned = [[phoneNr componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];

这应该适用于任何类型的空格(其中有许多)。虽然看起来有些低效,但对于电话号码来说,这应该是可以接受的。

在尝试替换@" " @" "(alt-space)和@"\u00a0"后,我几乎可以确定这种方法会起作用,但是这种方法对我没有起作用。 - self.name
关于通讯录电话号码的 \U00a0 问题,这对我起作用了。 - sam_smith
为了让这个在我的Localizable.strings文件中起作用,我不得不使用全大写:\U00A0 - Andrei Konstantinov

7

一些iOS7的电话号码使用非断空格进行编码。尝试以下操作:

        NSString* stringFormatted = [phoneNumber stringByReplacingOccurrencesOfString:@"\u00a0" withString:@""];

对我没用 :[ - self.name

5

另一个(非常灵活的)选项是使用正则表达式。这允许您保留 + 或任何其他您想要保留的字符。

let numberFromAddressBook = "+1 818 323 323 323"

let cleanNumber = numberFromAddressBook.stringByReplacingOccurrencesOfString("[^0-9+]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil)

"+1818323323323"

5
在进行大量的字符串清理后,我从地址簿中直接打印CFStringRef找到了答案。事情的背后是这样的...
1. 在iOS7中添加联系人,苹果会存储如下信息:(555).555-5555 (其中 . 实际上是U00A0或&nbsp) 2. 当我的应用程序从AddressBook中复制联系人信息到CFStringRef中时(当NSLog显示 . 时) 3. CFStringRef强制转换为NSString(现在NSLog显示555\U00a0555-5555)
为了去除 \U00A0,我尝试了这个线程中的3个答案和[NSCharacterSet characterSetWithRange:(160,1)],但都不起作用。最终可行的代码如下:
phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@"." withString:@""];

//其中@“.”是通过按Option+空格键创建的

这种方式对我来说行不通。 - beyerss

3
我在我的应用程序中使用的最干净的解决方案是:

NSMutableCharacterSet *phoneNubmerCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"+"];
[phoneNubmerCharacterSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
NSString* phoneString = [[phoneString componentsSeparatedByCharactersInSet:[phoneNubmerCharacterSet invertedSet]] componentsJoinedByString:@""];

没有“如果”逻辑,保留数字中的加号,去除所有类型的随机不需要的字符。

1
这个工作得非常完美,因为可能会有许多不需要的字符,比如\u0000等。 - iMemon

2

我对回答者的答案进行了小幅调整,以便有人想保留数字开头的+号。

如果您想在去除空格后保留加号,我做了这个小修改。

 Boolean shouldAddPlus = NO;

 if([[phoneNumber substringToIndex:1] isEqualToString:@"+"])
    {
        shouldAddPlus = YES;
    }

 phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];

 if(shouldAddPlus)
    phoneNumber = [base stringByAppendingString:phoneNumber];

1
正确的解决方案是用有效的空格替换出现次数。
NSString *clean = [dirty stringByReplacingOccurrencesOfString:@"\u00a0" withString:@" "];

所以您不会失去空间,用户可以看到其他应用程序中所看到的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接