我正在尝试将用户输入的一串数字转换为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]]];
我认为你的问题是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上并不存在。
UIPhoneFormats.plist包含每个语言环境的预定义电话格式。因此,如果您只对美国电话号码感兴趣,则需要考虑以下格式:
+1 (###) ###-#### 1 (###) ###-#### 011 $ ###-#### (###) ###-####
我不得不做类似的事情,我分享了我在这里得到的结果:http://the-lost-beauty.blogspot.com/2010/01/locale-sensitive-phone-number.html
那么一个电话号码应该是10个字符(11个带有前导1),所以你应该先改变这个:
[formatter setPositiveFormat:@"+# (###) ###-####"];
说到领先的1,你也需要检查它。
Apple表示如果现有格式化程序的功能不够,您可以实现自定义格式化程序:
NSFormatter用于子类化。自定义格式化程序可以以新颖的方式限制输入并增强数据显示。例如,您可以使用自定义格式化程序,以确保用户输入的序列号符合预定义格式。在决定创建自定义格式化程序之前,请确保不能配置公共子类NSDateFormatter和NSNumberFormatter以满足您的要求。
有关如何创建自定义格式化程序的说明,请参阅创建自定义格式化程序。
这里从未提及的一件事是NSNumberFormatter总是将值转换为NSNumber。如果你想要一个更通用的NSFormatter,子类NSFormatter并实现创建自定义格式化程序中提到的方法。