Как указывает @MwcsMac в своем ответе, ключом к решению этой проблемы является Formatter
(ранее известный как NSFormatter
), в частности, путем установки .numberStyle
на .spellOut
.
Хотя это подберет текущую локаль (и, следовательно, язык), проблема в том, что многие другие языки, кроме английского, не используют ту же терминологию «половина прошедшего», «четверть до» - например, в немецком языке 10:30 «полуэльф», буквально «от половины (до) одиннадцати».
Написание кода, который предполагает, что языковой стандарт является английским/американским, является действительно плохой практикой и, вероятно, приведет к отклонению приложения, если оно будет предлагаться за пределами этих областей, так что лучший вариант действительно может сделать формат "10:30" как "десять тридцать", "zehn dreißig".
Код с извинениями @MwcsMac:
import Foundation
let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minute = calendar.component(.minute, from: date)
func spell(_ number: Int, _ localeID: String) -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut
// Specify the locale or you will inherit the current default locale
formatter.locale = Locale(identifier: localeID)
if let s = formatter.string(from: NSNumber(value: number)) {
// AVOID forced unwrapping at all times!
return s
} else {
return "<Invalid>" // or make return optional and return `nil`
}
}
spell(hour, "EN") + " " + spell(minute, "EN") // "nineteen thirty-three"
spell(hour, "FR") + " " + spell(minute, "FR") // ""dix-neuf trente-trois"
spell(hour, "AR") + " " + spell(minute, "AR") // "تسعة عشر ثلاثة و ثلاثون"
person
Grimxn
schedule
20.02.2017