2015-07-21 72 views
3

我使用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 ...但我该怎么做?

任何帮助将不胜感激。

回答

2

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

+0

当然,这将工作快速ñ肮脏的,但怎么样的定位?如果你的目标是iOS8.0或更高版本,推荐的方法是使用[NSDateComponentsFormatter](https://developer.apple.com/library/prerelease/ios/documentation/Foundation/Reference/NSDateComponentsFormatter_class/index的.html)。 – Coxy1989

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

这是如何回答OP的问题?你能提供一些背景吗? – brandonscript

+0

OP:“时间以秒为单位存储在Int变量中”“我需要花费几秒钟时间,例如,变成1小时45分钟”。这段代码的确如此 – Coxy1989

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" 
+0

我接受了Glorfindel的答案,因为他指出了首先做到这一点的方式,但非常感谢这个有用的例子。 – 365SplendidSuns