Formatting Phone number in Swift

前端 未结 12 1870
天命终不由人
天命终不由人 2020-12-02 09:36

I\'m formatting my textfiled text once the user start typing the phone number into this format type 0 (555) 444 66 77 and it is working fine but once I get the

12条回答
  •  南方客
    南方客 (楼主)
    2020-12-02 09:52

    Swift 3 but should also be translatable to Swift 4

    1. ErrorHandling

      enum PhoneNumberFormattingError: Error {
          case wrongCharactersInPhoneNumber
          case phoneNumberLongerThanPatternAllowes
      }
      
    2. Create Patterns

      enum PhoneNumberFormattingPatterns: String {
          case mobile = "+xx (yxx) xxxxxxxxxxx"
          case home = "+xx (yxxx) xxxx-xxx"
      }
      
    3. Insert Function

      /**
           Formats a phone-number to correct format
           - Parameter pattern: The pattern to format the phone-number.
           - Example:
              - x: Says that this should be a digit.
              - y: Says that this digit cannot be a "0".
              - The length of the pattern restricts also the length of allowed phone-number digits.
                  - phone-number: "+4306641234567"
                  - pattern: "+xx (yxx) xxxxxxxxxxx"
                  - result: "+43 (664) 1234567"
      
           - Throws:
              - PhoneNumberFormattingError
                  - wrongCharactersInPhoneNumber: if phone-number contains other characters than digits.
                  - phoneNumberLongerThanPatternAllowes: if phone-number is longer than pattern allows.
           - Returns:
              - The formatted phone-number due to the pattern.
           */
      extension String {
          func vpToFormattedPhoneNumber(withPattern pattern: PhoneNumberFormattingPatterns) throws -> String {
              let phoneNumber = self.replacingOccurrences(of: "+", with: "")
              var retVal: String = ""
              var index = 0
              for char in pattern.rawValue.lowercased().characters {
                  guard index < phoneNumber.characters.count else {
                      return retVal
                  }
      
                  if char == "x" {
                      let charIndex = phoneNumber.index(phoneNumber.startIndex, offsetBy: index)
                      let phoneChar = phoneNumber[charIndex]
                      guard "0"..."9" ~= phoneChar else {
                          throw PhoneNumberFormattingError.wrongCharactersInPhoneNumber
                      }
                      retVal.append(phoneChar)
                      index += 1
                  } else if char == "y" {
                      var charIndex = phoneNumber.index(phoneNumber.startIndex, offsetBy: index)
                      var indexTemp = 1
                      while phoneNumber[charIndex] == "0" {
                          charIndex = phoneNumber.index(phoneNumber.startIndex, offsetBy: index + indexTemp)
                          indexTemp += 1
                      }
      
                      let phoneChar = phoneNumber[charIndex]
                      guard "0"..."9" ~= phoneChar else {
                          throw PhoneNumberFormattingError.wrongCharactersInPhoneNumber
                      }
                      retVal.append(phoneChar)
                      index += indexTemp
                  } else {
                      retVal.append(char)
                  }
              }
      
              if phoneNumber.endIndex > phoneNumber.index(phoneNumber.startIndex, offsetBy: index) {
                  throw PhoneNumberFormattingError.phoneNumberLongerThanPatternAllowes
              }
      
              return retVal
          }
      }
      
    4. Usage

      let phoneNumber = "+4306641234567"
      let phoneNumber2 = "4343211234567"
      
      do {
          print(try phoneNumber.vpToFormattedPhoneNumber(withPattern: .mobile))
          print(try phoneNumber2.vpToFormattedPhoneNumber(withPattern: .home))
      } catch let error as PhoneNumberFormattingError {
          switch error {
          case .wrongCharactersInPhoneNumber:
              print("wrong characters in phone number")
          case .phoneNumberLongerThanPatternAllowes:
              print("too long phone number")
          default:
              print("unknown error")
          }
      } catch {
          print("something other went wrong")
      }
      
      // output: +43 (664) 1234567
      // output: +43 (4321) 1234-567
      

提交回复
热议问题