NSNumberFormatter格式化美国电话号码

时间:2009-03-20 05:49:59

标签: iphone objective-c cocoa cocoa-touch

我正在尝试将用户输入的一串数字转换为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]]];

5 个答案:

答案 0 :(得分: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上不存在。

答案 1 :(得分:9)

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

  

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

  

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

     

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

请参阅the section in Data Formatting Guide

答案 4 :(得分:0)

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