From 9849636a1b797c11dcdb78f311d159575da09ace Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 20 Jan 2025 19:42:42 -0600 Subject: [PATCH] added telephone number formatter Signed-off-by: Matt Bruce --- EmployeeDirectory/Extensions/String.swift | 40 +++++++++++++++++++ .../ViewModels/EmployeeCellViewModel.swift | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 EmployeeDirectory/Extensions/String.swift diff --git a/EmployeeDirectory/Extensions/String.swift b/EmployeeDirectory/Extensions/String.swift new file mode 100644 index 0000000..1fb5318 --- /dev/null +++ b/EmployeeDirectory/Extensions/String.swift @@ -0,0 +1,40 @@ +// +// String.swift +// EmployeeDirectory +// +// Created by Matt Bruce on 1/20/25. +// + +import Foundation + +extension String { + /// Formats a string into a US phone number format (XXX-XXX-XXXX). + /// Non-numeric characters are removed, and formatting is applied based on the length of the string. + /// - Returns: A formatted phone number as a string. + internal func formatUSNumber() -> String { + // format the number + return format(with: "XXX-XXX-XXXX", phone: self) + } + + internal func format(with mask: String, phone: String) -> String { + let numbers = filter { $0.isNumber } + var result = "" + var index = numbers.startIndex // numbers iterator + + // iterate over the mask characters until the iterator of numbers ends + for ch in mask where index < numbers.endIndex { + if ch == "X" { + // mask requires a number in this place, so take the next one + result.append(numbers[index]) + + // move numbers iterator to the next index + index = numbers.index(after: index) + + } else { + result.append(ch) // just append a mask character + } + } + return result + } +} + diff --git a/EmployeeDirectory/ViewModels/EmployeeCellViewModel.swift b/EmployeeDirectory/ViewModels/EmployeeCellViewModel.swift index 6cba889..d86c241 100644 --- a/EmployeeDirectory/ViewModels/EmployeeCellViewModel.swift +++ b/EmployeeDirectory/ViewModels/EmployeeCellViewModel.swift @@ -27,7 +27,7 @@ public class EmployeeCellViewModel: ObservableObject { // Initialize properties self.uuid = employee.uuid.uuidString self.fullName = employee.fullName - self.phoneNumber = employee.phoneNumber + self.phoneNumber = employee.phoneNumber?.formatUSNumber() self.emailAddress = employee.emailAddress self.biography = employee.biography self.team = employee.team