3

我正在使用 iOS 图表来绘制我的 Swift iOS 应用程序中的一些数据,包括一些时间。时间以秒的形式存储在 Int 变量中,但显然人们不想在 Y 轴上看到 1 小时 45 分钟为 6300,所以我需要对其进行格式化。

iOS 图表允许您设置使用 NSNumberFormatter 来执行此操作

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

但是没有一种可用的样式适合我的需要。我需要它花费几秒钟,然后变成例如 1h 45m。所以我想制作一个自定义的 NSNumberFormatterStyle ......但是我该怎么做呢?

任何帮助将非常感激。

4

3 回答 3

3

一个很好的方法是创建一个子类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"
于 2015-07-21T19:22:47.460 回答
2

这不适用于 NSNumberFormatterStyle - 它的选项对你来说太有限了。您应该做的是 subclass NSNumberFormatter,并覆盖该stringFromNumber:功能。在那里你可以做所有你想要的字符串操作。

于 2015-07-21T19:02:35.433 回答
0
let formatter = NSDateComponentsFormatter()
formatter.zeroFormattingBehavior = .Pad
formatter.allowedUnits = [.Hour, .Minute, .Second]
formatter.unitsStyle = .Positional
let timeString = formatter.stringFromTimeInterval(Double(secondsElapsed))!
于 2015-07-21T19:07:28.033 回答