NSNumberFormatter格式化美国电话号码

问题描述 投票:8回答:5

我正在尝试将用户输入的一串数字转换为iPhone上的Phone.app等性感字符串。这是我正在使用的代码,它不起作用(没有特殊格式出现),并且在一定数量的数字之后它只是开始在字符串的末尾添加“0”。

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterNoStyle];
[formatter setPositiveFormat:@"+# (###) ###-###"];
[formatter setLenient:YES];
NSString *strDigits = [self stringByReplacingOccurrencesOfRegex:@"[^0-9+]" withString:@""];
return [formatter stringFromNumber:[NSNumber numberWithDouble:[strDigits doubleValue]]];
iphone objective-c cocoa cocoa-touch
5个回答
11
投票

我认为你的问题是NSNumberFormatter不支持括号,空格或破折号。我尝试实现与您相同的方法,它无声地失败,只输出未格式化的文本。

这里的一般问题是iPhone SDK没有提供以区域设置相关方式格式化电话号码的方法。

我已经向Apple提出了以下错误(其中两个是已知问题的重复,因此我已经包含了Apple的原始错误#):

#6933244 - Need iPhone SDK interface to format text as locale dependent phone number
#5847381 - UIControl does not support a setFormatter method
#6024985 - Overridden UITextField drawTextInRect method is never called

在一个理想的世界中,Apple会提供NSPhoneNumberFormatter,你会在你的setFormatter上调用UIControl,所以它以漂亮的方式展示了text。不幸的是,iPhone上并不存在。


9
投票

UIPhoneFormats.plist包含每个语言环境的预定义电话格式。因此,如果您只对美国电话号码感兴趣,则需要考虑以下格式:

+1 (###) ###-#### 1 (###) ###-#### 011 $ ###-#### (###) ###-####

我不得不做类似的事情,我分享了我在这里得到的结果:http://the-lost-beauty.blogspot.com/2010/01/locale-sensitive-phone-number.html


2
投票

那么一个电话号码应该是10个字符(11个带有前导1),所以你应该先改变这个:

[formatter setPositiveFormat:@"+# (###) ###-####"];

说到领先的1,你也需要检查它。


2
投票

Apple表示如果现有格式化程序的功能不够,您可以实现自定义格式化程序:

NSFormatter用于子类化。自定义格式化程序可以以新颖的方式限制输入并增强数据显示。例如,您可以使用自定义格式化程序,以确保用户输入的序列号符合预定义格式。在决定创建自定义格式化程序之前,请确保不能配置公共子类NSDateFormatter和NSNumberFormatter以满足您的要求。

有关如何创建自定义格式化程序的说明,请参阅创建自定义格式化程序。

the section in Data Formatting Guide


0
投票

这里从未提及的一件事是NSNumberFormatter总是将值转换为NSNumber。如果你想要一个更通用的NSFormatter,子类NSFormatter并实现创建自定义格式化程序中提到的方法。

© www.soinside.com 2019 - 2024. All rights reserved.