自定义 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"
我正在使用 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"