Estoy usando el siguiente DateComponentsFormatter en Swift:
let formatter = DateComponentsFormatter() formatter.unitsStyle = .positional formatter.allowedUnits = [.hour, .minute, .second] formatter.zeroFormattingBehavior = [.default]Esto produce resultados como 2:41 (durante 2 minutos y 41 segundos) y 08 (durante 8 segundos). Sin embargo, me gustaría mantener al menos un dígito en el lugar de los minutos, devolviendo 0:08 en lugar de 08. ¿Es esto posible con DateComponentsFormatter? Preferiría una solución que devuelva un resultado localizado.
Sí. Esto se puede lograr fácilmente agregando un condicional ternario basado en el intervalo de tiempo al establecer las unidades permitidas por el formateador de componentes de fecha:
Xcode 11 • Swift 5.1
extension Formatter { static let positional: DateComponentsFormatter = { let positional = DateComponentsFormatter() positional.unitsStyle = .positional positional.zeroFormattingBehavior = .pad return positional }() } extension TimeInterval { var positionalTime: String { Formatter.positional.allowedUnits = self >= 3600 ? [.hour, .minute, .second] : [.minute, .second] let string = Formatter.positional.string(from: self)! return string.hasPrefix("0") && string.count > 4 ? .init(string.dropFirst()) : string } }Uso
8.0.positionalTime // "0:08" 161.0.positionalTime // "2:41" 3600.0.positionalTime // "1:00:00"Se me ocurrió esta solución, empleando una expresión regular, que aparentemente cubre todos los casos:
let formatter = DateComponentsFormatter() formatter.allowedUnits = [.hour, .minute, .second] formatter.unitsStyle = .positional formatter.zeroFormattingBehavior = .pad func durationString(for duration: TimeInterval) -> String { formatter.string(from: duration)! .replacingOccurrences(of: #"^00[:.]0?|^0"#, with: "", options: .regularExpression) } durationString(for: 0) // 0:00 durationString(for: 1) // 0:01 durationString(for: 10) // 0:10 durationString(for: 60) // 1:00 durationString(for: 600) // 10:00 durationString(for: 3600) // 1:00:00 durationString(for: 36000) // 10:00:00Consulte un valor de propiedad zeroFormattingBehavior diferente. Utilizo esto para obtener el resultado que creo que estás buscando, pero experimenta según sea necesario...
formatter.zeroFormattingBehavior = [.pad]