// // Formatters.swift // Haru_Danim // import Foundation enum Format { /// 1:23:45 또는 23:45 형식 (진행 중 타이머용) static func timer(_ interval: TimeInterval) -> String { let total = Int(interval.rounded(.down)) let h = total / 3600 let m = (total % 3600) / 60 let s = total % 60 if h > 0 { return String(format: "%d:%02d:%02d", h, m, s) } return String(format: "%d:%02d", m, s) } /// "2시간 30분" / "45분" / "30초" 형식 static func durationShort(_ interval: TimeInterval) -> String { let total = Int(interval.rounded()) let h = total / 3600 let m = (total % 3600) / 60 if h > 0 { return m > 0 ? String(localized: "\(h)시간 \(m)분") : String(localized: "\(h)시간") } if m > 0 { return String(localized: "\(m)분") } return String(localized: "\(total)초") } static func weekdayShort(_ weekday: Int) -> String { let names = [ String(localized: "일", comment: "요일 축약(일요일)"), String(localized: "월", comment: "요일 축약(월요일)"), String(localized: "화", comment: "요일 축약(화요일)"), String(localized: "수", comment: "요일 축약(수요일)"), String(localized: "목", comment: "요일 축약(목요일)"), String(localized: "금", comment: "요일 축약(금요일)"), String(localized: "토", comment: "요일 축약(토요일)"), ] let index = (weekday - 1) % 7 return names[max(0, index)] } static func shortDate(_ date: Date) -> String { date.formatted(.dateTime.month(.defaultDigits).day()) } static func fullDate(_ date: Date) -> String { date.formatted(.dateTime.year().month().day().weekday(.short)) } static func time(_ date: Date) -> String { date.formatted(.dateTime.hour().minute()) } static func percent(_ ratio: Double) -> String { "\(Int((ratio * 100).rounded()))%" } /// 횟수 평균 표기 ("3.5회"). String(format:)은 카탈로그로 추출되지 않아 /// 영어·일본어에서 '회'가 그대로 노출되던 것을 지역화한다. static func countAverage(_ value: Double) -> String { let rounded = (value * 10).rounded() / 10 return String(localized: "\(rounded.formatted(.number.precision(.fractionLength(1))))회", comment: "횟수 평균 (소수 1자리)") } }