Пользовательский Swift NSNumberFormatterStyle

Я использую диаграммы iOS для отображения некоторых данных в моем приложении Swift для iOS, в том числе несколько раз. Время хранится в переменных Int в виде секунд, но, очевидно, люди не хотят видеть 1 час и 45 минут по оси Y как 6300, поэтому мне нужно его отформатировать.

Диаграммы iOS позволяют вам использовать NSNumberFormatter, чтобы сделать это так

var formatter: NSNumberFormatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.SpellOutStyle
chartHolder.leftAxis.valueFormatter = formatter

Но ни один из доступных стилей не подходит для того, что мне нужно. Мне нужно, чтобы это заняло несколько секунд и превратилось, например, в 1 час 45 минут. Итак, я хочу создать собственный NSNumberFormatterStyle... Но как мне это сделать?

Любая помощь приветствуется.


person 365SplendidSuns    schedule 21.07.2015    source источник


Ответы (3)


Это не будет работать с NSNumberFormatterStyle — его возможности слишком ограничены для вас. Что вам нужно сделать, так это подкласс NSNumberFormatter и переопределить stringFromNumber:. Там вы можете делать все необходимые манипуляции со строками.

person Glorfindel    schedule 21.07.2015
comment
Конечно, это будет работать быстро и грязно, но как насчет локализации? Если вы ориентируетесь на iOS 8.0 и выше, рекомендуемый способ добиться желаемого — использовать NSDateComponentsFormatter. - person Coxy1989; 22.07.2015

Хорошим способом сделать это было бы создание подкласса NSNumberFormatter и использование NSDateFormatter внутри него для создания строкового вывода из вашего числа, похожего на время. Вот пример:

class ElapsedTimeFormatter: NSNumberFormatter {

    lazy var dateFormatter: NSDateFormatter = {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "HH:mm"
        return dateFormatter
    }()

    override func stringFromNumber(number: NSNumber) -> String? {
        let timeInterval = NSTimeInterval(number)
        return dateFormatter.stringFromDate(NSDate(timeIntervalSinceReferenceDate: timeInterval))
    }
}

Тест:

let formatter = ElapsedTimeFormatter()
let s = formatter.stringFromNumber(6300)
// Output: s = "01:45"
person Clafou    schedule 21.07.2015
comment
Я принял ответ Глорфинделя, поскольку он сначала указал, как это сделать, но большое спасибо за полезный пример. - person 365SplendidSuns; 21.07.2015

person    schedule
comment
Как это отвечает на вопрос ОП? Можете ли вы предоставить некоторый контекст? - person brandonscript; 21.07.2015
comment
ОП: время хранится в переменных Int в виде секунд. Мне нужно, чтобы это заняло несколько секунд и превратилось, например, в 1 час 45 минут. Этот код делает именно это - person Coxy1989; 22.07.2015