2

我正在使用 Charts 框架,因此我可以显示统计数据,它采用简单的数值,例如 1、5、17、99、1,574 等并将它们绘制在图表上。

它提供了设置选项以NSNumberFormatter更优雅地显示这些值。

我使用的数字是总秒数。例如 660 秒、1080 秒。

如何使用NSNumberFormatter使我的数字显示为小时、分钟、秒,而不是纯粹的总秒数?

4

3 回答 3

5

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!
于 2018-08-13T22:03:51.840 回答
4

如果您在谈论 xAxis 标签,它们是字符串,而不是数字,因此您可以直接将日期字符串传递给 xAxis 值。

如果您在谈论 yAxis 标签,您知道 y 轴代表数字,这就是我们可以绘制图表的原因。

如果您真的想这样做,您可以编写自己的 NSNumberFormatter 子类并覆盖stringFromNumber,以手动将数字转换为您想要的时间。并将此格式化程序用于yAxis.valueFormatter.

这是简单的数学运算,您只需除以 60/3600 即可得到分钟或小时。

关键是,你必须知道你想如何翻译这个数字。例如,如果 yAxis 标签上的“60”确实表示“60 秒”,否则您的图表毫无意义。

于 2015-12-24T01:14:34.347 回答
1

NSNumberFormatter真的不适合这个。你可以硬着头皮NSDateFormatter去做你想做的事,但这些设计是为了显示一天中的日期和时间,而不是像你想要的那样显示经过的时间。

看看关于这个主题的这个线程:

将秒格式化为 hh:ii:ss

特别是@dreamlax 答案。

如果您不需要支持自动本地化,这是最简单的方法。

于 2015-12-23T16:35:15.867 回答