自定义Swift NSNumberFormatterStyle
我使用iOS图表来绘制Swift iOS应用程序中的一些数据,包括一些时间。时间以秒为单位存储在Int变量中,但显然人们不希望在Y轴上看到1小时45分钟,因此我需要格式化它。自定义Swift NSNumberFormatterStyle
iOS的图表,您可以设置使用NSNumberFormatter要做到这一点,像这样
var formatter: NSNumberFormatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.SpellOutStyle
chartHolder.leftAxis.valueFormatter = formatter
但没有可用的风格适合我的需要。我需要花几秒钟时间,例如1小时45分钟。所以我想制作一个自定义的NSNumberFormatterStyle ...但我该怎么做?
任何帮助将不胜感激。
这不适用于NSNumberFormatterStyle - 它的选项对你来说太有限了。你应该做的是子类NSNumberFormatter
,并覆盖stringFromNumber:
函数。在那里你可以做所有你想要的字符串操作。
let formatter = NSDateComponentsFormatter()
formatter.zeroFormattingBehavior = .Pad
formatter.allowedUnits = [.Hour, .Minute, .Second]
formatter.unitsStyle = .Positional
let timeString = formatter.stringFromTimeInterval(Double(secondsElapsed))!
这是如何回答OP的问题?你能提供一些背景吗? – brandonscript
OP:“时间以秒为单位存储在Int变量中”“我需要花费几秒钟时间,例如,变成1小时45分钟”。这段代码的确如此 – Coxy1989
一个很好的办法做到这将是为你打造的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"
我接受了Glorfindel的答案,因为他指出了首先做到这一点的方式,但非常感谢这个有用的例子。 – 365SplendidSuns
当然,这将工作快速ñ肮脏的,但怎么样的定位?如果你的目标是iOS8.0或更高版本,推荐的方法是使用[NSDateComponentsFormatter](https://developer.apple.com/library/prerelease/ios/documentation/Foundation/Reference/NSDateComponentsFormatter_class/index的.html)。 – Coxy1989