어제 로드한 영상에 조회수랑 업로드 일자를 불러오는데 그대로 넣으니까 좀 없어보인다..
그리고 api에서 넘겨주는 date는 심지어 ISO 8601 형식이라서 그대로 쓸 수도 없다.
그래서 유튜브처럼 조회수는 천회, 만회 기준으로 그 이상일 때는 소수점 1자리로 표현하고, 업로드일자는 오늘 날짜 기준으로 몇분전, 몇시간전, 몇일전, 몇년전.. 등 으로 표기하기 위해 foamat 형식을 바꿔주는 코드를 정리해보려고 한다.
NumberFormatter는 Foundation 프레임워크에서 제공하는 클래스로, 숫자를 원하는 형식으로 서식화하고 역으로 파싱하는 데 사용한다. 주로 숫자를 문자열로 변환하거나, 문자열을 숫자로 변환할 때 유용하게 활용된다.
주요 기능 및 속성
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.locale = Locale.current
let formattedString = numberFormatter.string(from: NSNumber(value: 1234567.89))
print(formattedString) // 출력: "1,234,567.89"
if let parsedNumber = numberFormatter.number(from: "3,456.78") {
print(parsedNumber) // 출력: 3456.78
}
커스텀 조건
api에서 전달받은 조회수는 String 형태이므로 정수형으로 먼저 변환이 필요하다. 그리고 1,000, 10,000 단위로 조회수를 표기하려고 한다.
// MARK: - ViewCount Format
private func customFormattedViewsCount(_ viewsCount: String) -> String {
if let viewsCount = Int(viewsCount) {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 1
if viewsCount >= 10000 {
let viewsInTenThousand = Double(viewsCount) / 10000.0
return numberFormatter.string(from: NSNumber(value: viewsInTenThousand))! + "만회"
} else if viewsCount >= 1000 {
let viewsInThousand = Double(viewsCount) / 1000.0
return numberFormatter.string(from: NSNumber(value: viewsInThousand))! + "천회"
} else {
return "\(viewsCount)회"
}
} else {
return "조회수 로드 오류"
}
}
DateComponents는 날짜와 시간을 구성하는 여러 구성 요소를 나타내는 객체이다. 주로 날짜 및 시간 작업을 수행할 때 사용되며, 연, 월, 일, 시, 분, 초 및 기타 시간 관련 정보를 쉽게 조작하고 검색할 수 있다.
주요 기능 및 속성
DateComponents는 주로 Calendar와 함께 사용되며, 날짜 및 시간 연산 및 계산을 수행할 때 유용하다. 예를 들어, 특정 날짜에서 연, 월, 일을 추출하거나, 주어진 날짜에서 특정 기간을 더하거나 뺄 때 DateComponents를 사용할 수 있다. 나는 DateComponents를 사용하여 업로드 일자와 오늘 날짜의 차이를 계산하여 표시하려고 한다.
// MARK: - Date Format
private func timeAgoSinceDate(_ isoDateString: String) -> String {
let dateFormatter = ISO8601DateFormatter()
guard let date = dateFormatter.date(from: isoDateString) else {
return "Invalid Date"
}
let currentDate = Date()
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date, to: currentDate)
if let year = components.year, year > 0 {
return "\(year)년 전"
} else if let month = components.month, month > 0 {
return "\(month)개월 전"
} else if let day = components.day, day > 0 {
return "\(day)일 전"
} else if let hour = components.hour, hour > 0 {
return "\(hour)시간 전"
} else if let minute = components.minute, minute > 0 {
return "\(minute)분 전"
} else if let second = components.second, second > 0 {
return "\(second)초 전"
} else {
return "방금 전"
}
}