自定义 Swift NSNumberFormatterStyle

Custom Swift NSNumberFormatterStyle

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

iOS 图表可让您设置使用 NSNumberFormatter 来执行此操作

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

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

如有任何帮助,我们将不胜感激。

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

let formatter = NSDateComponentsFormatter()
formatter.zeroFormattingBehavior = .Pad
formatter.allowedUnits = [.Hour, .Minute, .Second]
formatter.unitsStyle = .Positional
let timeString = formatter.stringFromTimeInterval(Double(secondsElapsed))!

一个很好的方法是创建一个 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"