Я использую структуру диаграмм, поэтому я могу отображать статистику, и она принимает простые числовые значения, например 1, 5, 17, 99, 1574 и т.д., и отображает их на графике.

Это дает возможность установить NSNumberFormatter для более элегантного отображения этого значения.

Цифры, которые я использую, - это общее количество секунд. Например. 660 секунд, 1080 секунд.

Как я могу использовать NSNumberFormatter, чтобы мое число отображалось в часах, минутах, секундах, а не только в секундах?

2
Josh Kahane 23 Дек 2015 в 19:00

3 ответа

Лучший ответ

Если вы говорите о метках xAxis, то они представляют собой строки, а не числа, поэтому вы можете напрямую передавать строки даты в значения xAxis.

Если вы говорите о метках yAxis, поскольку вы знаете, что ось y представляет собой число, поэтому мы можем рисовать диаграммы.

Если вы действительно хотите сделать это, вы можете написать свой собственный подкласс NSNumberFormatter и переопределить stringFromNumber, чтобы вручную перевести число в нужное вам время. И используйте это средство форматирования для yAxis.valueFormatter.

Это простая математика, вам просто нужно разделить 60/3600, чтобы получить минуты или часы.

Дело в том, что вы должны знать, как вы хотите перевести число. например если «60» на этикетке yAxis действительно означает «60 секунд», иначе ваш график не имеет смысла.

4
Wingzero 24 Дек 2015 в 01:14

DateComponentsFormatter, доступный в iOS 8, работает хорошо, особенно если вам нужна простая локализация. Вот несколько примеров.

let duration : TimeInterval = 11735    // seconds
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]

formatter.unitsStyle = .abbreviated
let text1 = formatter.string(from: duration)     // "3h 15m 35s"

// choose a longer unit style:
formatter.unitsStyle = .short
let text2 = formatter.string(from: duration)     // "3 hr, 15 min, 35 sec"

// easy localization:
formatter.calendar?.locale = Locale(identifier: "da_DK")
let text3 = formatter.string(from: duration)     // "3 t., 15 min. og 35 sek."

// approximate to whole minutes:
formatter.calendar?.locale = Locale(identifier: "en_US")
formatter.includesApproximationPhrase = true
formatter.allowedUnits = [.hour, .minute]
let text4 = formatter.string(from: duration)     // "About 3 hr, 15 min" - (not rounding up)

// approximation AND localization (Apple has a bug to fix):
formatter.calendar?.locale = Locale(identifier: "da_DK")
formatter.includesApproximationPhrase = true
formatter.allowedUnits = [.hour, .minute]
let text5 = formatter.string(from: duration)     // "About 3 t. og 15 min." - Ugh!
4
rene 13 Авг 2018 в 22:03

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

Взгляните на эту ветку SO по этому вопросу:

Форматирование секунд в hh: ii: ss

В частности ответ @dreamlax.

Если вам не нужна поддержка автоматической локализации, это самый простой способ сделать это.

1
Community 23 Май 2017 в 12:08