【问题标题】:NSNumberFormatter to format US Telephone NumbersNSNumberFormatter 格式化美国电话号码
【发布时间】:2010-10-14 11:41:14
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为您的问题是 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,您可以在您的UIControl 上调用setFormatter,这样它就会以一种非常漂亮的方式显示text。不幸的是,这在 iPhone 上不存在。

      【讨论】:

        【解决方案3】:

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

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

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

        the section in Data Formatting Guide

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

            电话号码应该是 10 个字符(11 个以 1 开头),所以你应该从改变这个开始:

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

            说到前导 1,你也需要检查一下。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-08-16
              • 1970-01-01
              • 2011-05-22
              • 1970-01-01
              • 2015-10-02
              • 1970-01-01
              • 2023-04-03
              相关资源
              最近更新 更多