你必须numberStyle设置DecimalStyle能够根据设置minimumFractionDigits财产,如果双重甚至与否如下:
extension Double {
var formatted: String {
let numberFormater = NSNumberFormatter()
numberFormater.locale = NSLocale.currentLocale()
numberFormater.numberStyle = NSNumberFormatterStyle.DecimalStyle
numberFormater.maximumFractionDigits = 2
numberFormater.minimumFractionDigits = self - Double(Int(self)) == 0 ? 0 : 2
return numberFormater.stringFromNumber(self) ?? ""
}
}
3.0.formatted // "3"
3.12.formatted // "3.12"
3.20.formatted // "3.20"
var price = 3.20
println("price: \(price.formatted)")
编辑
extension Double {
var currency: String {
let numberFormater = NSNumberFormatter()
numberFormater.locale = NSLocale.currentLocale()
numberFormater.numberStyle = NSNumberFormatterStyle.CurrencyStyle
let result = numberFormater.stringFromNumber(self) ?? ""
return result.hasSuffix(".00") || result.hasSuffix(",00") ? result[result.startIndex..<result.endIndex.predecessor().predecessor().predecessor()] : result
}
}
3.0.currency // "$3"
3.12.currency // "$3.12"
3.2.currency // "$3.20"
var price = 3.0
println("price: \(price.currency)")
如果你在处理货币,你应该使用'NSDecimalNumber'而不是'double',因为double不能代表所有的t他完全需要价值。从文档:NSDecimalNumber,一个NSNumber的不可变子类,提供了一个面向对象的包装,用于执行基10算术。双1.01不能完全代表它是:1.01000000000000000888。这个小错误在其他问题之间进行比较时是有意义的。 – zaph
您可以通过将价格四舍五入到最接近的整数来创建一个名为'roundedPrice'的变量,然后将2个小数位应用于'roundedPrice'。然后,如果'price == roundedPrice','numberFormater.maximumFractionDigits = 0',else,'= 2'。这只是我头顶的一些伪代码,但它可能会给你一些想法。 – blwinters
@zaph可以将Double转换为NSDecimalNumber – confile