【问题标题】:String to Phone Number format on iOSiOS上的字符串到电话号码格式
【发布时间】:2013-02-05 03:04:56
【问题描述】:

在我的应用程序中,我有一个类似的字符串:

“3022513240”

我想这样转换:

(302)-251-3240

我该如何解决这个问题?

【问题讨论】:

  • Phone number formatting的可能重复
  • @ColinE:用于文本输入期间的“实时”格式化。 OP 询问如何格式化“现成”字符串。即使来自链接问题的答案绝对可以帮助 OP。
  • 这在我的国家不是有效的电话号码格式...
  • @user1673099 我希望您了解您选择的解决方案仅适用于两个国家,而不适用于世界其他地区。您的问题不清楚您的要求,但您的应用程序将在世界各地使用。每个国家/地区的电话号码格式都不同。请记住这一点。

标签: ios objective-c nsstring phone-number


【解决方案1】:

这是一个 Swift 扩展,可将字符串格式化为 10 位数字的电话号码。

extension String {    
    public func toPhoneNumber() -> String {
        return stringByReplacingOccurrencesOfString("(\\d{3})(\\d{3})(\\d+)", withString: "($1) $2-$3", options: .RegularExpressionSearch, range: nil)
    }
}

例如:

let number = "1234567890"
let phone = number.toPhoneNumber()
print(phone)
// (123) 456-7890

更新到 Swift 3.0

extension String {
    public func toPhoneNumber() -> String {
        return self.replacingOccurrences(of: "(\\d{3})(\\d{3})(\\d+)", with: "($1) $2-$3", options: .regularExpression, range: nil)
    }
}

【讨论】:

    【解决方案2】:

    我会这样做:

    例子:

     NSMutableString *stringts = [NSMutableString stringWithString:self.ts.text];
     [stringts insertString:@"(" atIndex:0];
     [stringts insertString:@")" atIndex:4];
     [stringts insertString:@"-" atIndex:5];
     [stringts insertString:@"-" atIndex:9];
     self.ts.text = stringts;
    

    希望这会有所帮助...

    【讨论】:

    • 谢谢。对我帮助很大。尤其是当美国/加拿大格式在任何语言环境中都应该工作时。赞成。
    【解决方案3】:

    你可以使用this的方式

    NSError *aError = nil;
    NBPhoneNumber *myNumber1 = [phoneUtil parse:@"6766077303" defaultRegion:@"AT" error:&aError];
    if (aError == nil)
    {
        NSLog(@"isValidPhoneNumber ? [%@]", [phoneUtil isValidNumber:myNumber1] ? @"YES":@"NO");
        NSLog(@"E164          : %@", [phoneUtil format:myNumber1 numberFormat:NBEPhoneNumberFormatE164]);
        NSLog(@"INTERNATIONAL : %@", [phoneUtil format:myNumber1 numberFormat:NBEPhoneNumberFormatINTERNATIONAL]);
        NSLog(@"NATIONAL      : %@", [phoneUtil format:myNumber1 numberFormat:NBEPhoneNumberFormatNATIONAL]);
        NSLog(@"RFC3966       : %@", [phoneUtil format:myNumber1 numberFormat:NBEPhoneNumberFormatRFC3966]);
    }
    else
    {
        NSLog(@"Error : %@", [aError localizedDescription]);
    }
    

    【讨论】:

    • 我使用这个,但第一次输入号码和第二次相同的呼叫所以应用程序崩溃。
    【解决方案4】:

    斯威夫特 4.2

    extension String {
    public func toPhoneNumber() -> String {
        return self.replacingOccurrences(of: "(\\d{3})(\\d{3})(\\d+)", with: "$1-$2-$3", options: .regularExpression, range: nil)
    }}
    

    结果

    【讨论】:

      【解决方案5】:

      斯威夫特 4.2

      处理 10 位和 11 位电话号码,这些电话号码在字符串中可能已经或可能没有格式或非数字字符。

      将处理:

      • 1234567890、12345678901、123 456 7890、123-456-7890、(123) 456-7890、1-234-567-8901

      结果:

      • (999)-999-9999
      • 1(999)-999-9999

      代码:

      extension String {
      
          /// Handles 10 or 11 digit phone numbers
          ///
          /// - Returns: formatted phone number or original value
          public func toPhoneNumber() -> String {
              let digits = self.digitsOnly
              if digits.count == 10 {
                  return digits.replacingOccurrences(of: "(\\d{3})(\\d{3})(\\d+)", with: "($1)-$2-$3", options: .regularExpression, range: nil)
              }
              else if digits.count == 11 {
                  return digits.replacingOccurrences(of: "(\\d{1})(\\d{3})(\\d{3})(\\d+)", with: "$1($2)-$3-$4", options: .regularExpression, range: nil)
              }
              else {
                  return self
              }
          }
      
      }
      
      extension StringProtocol {
      
          /// Returns the string with only [0-9], all other characters are filtered out
          var digitsOnly: String {
              return String(filter(("0"..."9").contains))
          }
      
      }
      

      例子:

      let num = "1234567890"
      let formatted = num.toPhoneNumber()
      // Formatted is "(123)-456-7890"
      

      【讨论】:

        【解决方案6】:

        您可以使用(\d{3})(\d{3})(\d{4}) 之类的正则表达式,并将匹配模式的输入替换为($1)-$2-$3

        【讨论】:

        • 这只支持一组有限的电话号码。
        • @rmaddy OP 声明 3022513240 类似的数字必须转换为 (302)-251-3240 类似的格式。为此,给定的正则表达式就足够了。为什么问题仍然如此?
        • 我只是在观察。 OP 可能不了解他们的应用程序可能被世界各地的人们使用,并且每个国家/地区的电话号码格式都不同。但是是的,如果用户真的只需要格式化美国和加拿大的电话号码,那么您的正则表达式就可以了。
        • @rmaddy 我不认为这是一个有用的观察,只要 OP 只想将数字更改为特定格式。
        【解决方案7】:

        这个简单易行

        -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
        {
           if (string.length) {
               if (textField.text.length<=13) {
                   if (textField.text.length==3) {
                       NSString *tempStr=[NSString stringWithFormat:@"(%@)- ",textField.text];
                       textField.text=tempStr;
                   } else if (textField.text.length==8) {
                       NSString *tempStr=[NSString stringWithFormat:@"%@-",textField.text];
                       textField.text=tempStr;
                   }
               } else {
                   return NO;
               }
           }
           return YES;
        }
        

        【讨论】:

          【解决方案8】:

          我使用SHSPhoneNumberFormatter 来执行此操作,因此我不必更改UITextField 的类型或子类

          设置:

          let phoneNumberFormatter = SHSPhoneNumberFormatter()
          phoneNumberFormatter.setDefaultOutputPattern("(###) ###-####")
          

          监听UITextFieldTextDidChangeNotification 并运行以下命令:

          let phoneDict = phoneNumberFormatter.valuesForString(phoneTextField.text) 
          phoneTextField.text = phoneDict["text"] as? String
          

          【讨论】:

            【解决方案9】:

            查找RMPhoneFormat,我用它很棒。

            【讨论】:

            • 我也使用这个,但我检查它与联系人应用程序使用的甲酸盐不匹配,对于印度(+91)它显示不同的甲酸盐,也适用于美国。请帮助我,我只想为联系人应用程序本身实现相同的功能。谢谢 。我还发布了一个问题,请在此处回复或在我的问题上回复stackoverflow.com/questions/32390073/ios-native-phone-formater
            • github.com/tunabelly/RMPhoneFormat 增加了对 12 位以上字符串的支持。你试过这个叉子吗?我知道一个对印度格式开放的问题。美国格式应该很好,我在加拿大/美国使用它,上次使用它很好。但从那以后已经有一段时间了。编辑:你试过github.com/iziz/libPhoneNumber-iOS这个库看起来很活跃,上次更新是上个月。
            • 未找到 user100 页面
            【解决方案10】:

            您可以使用RMPhoneFormat 库来格式化电话号码。 格式应复制您在“通讯录”应用中看到的相同电话号码的内容。

            【讨论】:

            • Edwin,这会被 AppStore 接受吗?我看到它使用了一些私有框架。
            • 如果是这样,那么我上次提交应用程序时很幸运。如果您确定这一点,那么您可以在 github 上为此创建一个问题吗?您在哪个文件/行上看到了这个?
            • 自述文件是这么说的。我最终使用了 ishtar 在他的回答中提到的库。
            • 啊,它使用来自私有框架的文件副本。它没有使用私有框架本身。你可以使用它,因为它是一个副本。注释说:此类依赖于 Apple 提供的名为 Default.phoneformat 的私有框架文件的副本,该文件被复制到应用程序的资源包中并命名为 PhoneFormats.dat。
            • @NatanR。我也使用它,但我检查它与联系人应用程序使用的甲酸盐不匹配,对于印度(+91)它显示不同的甲酸盐,也适用于美国。请帮助我,我只想为联系人应用程序本身实现相同的功能。谢谢 。我还发布了一个问题,请在此处或在我的问题 stackoverflow.com/questions/32390073/ios-native-phone-formater 上回复
            【解决方案11】:

            这是将字符串转换为电话号码格式的代码

            斯威夫特 3

            func PhoneNumberFormate( str : NSMutableString)->String{
                    str.insert("(", at: 0)
                    str.insert(")", at: 4)
                    str.insert("-", at: 8)
                    return str as String
                }
            

            使用

            let nsMutableString = NSMutableString(string: "3022513240")
            let strModify = self.PhoneNumberFormate(str: nsMutableString)
            

            【讨论】:

              猜你喜欢
              • 2011-08-28
              • 2014-04-01
              • 2010-12-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-03
              • 2023-03-27
              • 2013-06-10
              相关资源
              最近更新 更多