我正在使用 Charts 框架,因此我可以显示统计数据,它采用简单的数值,例如 1、5、17、99、1,574 等并将它们绘制在图表上。
它提供了设置选项以NSNumberFormatter
更优雅地显示这些值。
我使用的数字是总秒数。例如 660 秒、1080 秒。
如何使用NSNumberFormatter
使我的数字显示为小时、分钟、秒,而不是纯粹的总秒数?
我正在使用 Charts 框架,因此我可以显示统计数据,它采用简单的数值,例如 1、5、17、99、1,574 等并将它们绘制在图表上。
它提供了设置选项以NSNumberFormatter
更优雅地显示这些值。
我使用的数字是总秒数。例如 660 秒、1080 秒。
如何使用NSNumberFormatter
使我的数字显示为小时、分钟、秒,而不是纯粹的总秒数?
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!
如果您在谈论 xAxis 标签,它们是字符串,而不是数字,因此您可以直接将日期字符串传递给 xAxis 值。
如果您在谈论 yAxis 标签,您知道 y 轴代表数字,这就是我们可以绘制图表的原因。
如果您真的想这样做,您可以编写自己的 NSNumberFormatter 子类并覆盖stringFromNumber
,以手动将数字转换为您想要的时间。并将此格式化程序用于yAxis.valueFormatter
.
这是简单的数学运算,您只需除以 60/3600 即可得到分钟或小时。
关键是,你必须知道你想如何翻译这个数字。例如,如果 yAxis 标签上的“60”确实表示“60 秒”,否则您的图表毫无意义。
NSNumberFormatter
真的不适合这个。你可以硬着头皮NSDateFormatter
去做你想做的事,但这些设计是为了显示一天中的日期和时间,而不是像你想要的那样显示经过的时间。
看看关于这个主题的这个线程:
特别是@dreamlax 答案。
如果您不需要支持自动本地化,这是最简单的方法。