2015-06-19 55 views
0

我下面举个例子:从货币中删除小数位吗?

// Currencies 

var price: Double = 3.20 
println("price: \(price)") 

let numberFormater = NSNumberFormatter() 
numberFormater.locale = locale 
numberFormater.numberStyle = NSNumberFormatterStyle.CurrencyStyle 
numberFormater.maximumFractionDigits = 2 

我想有2个消化货币输出。如果货币摘要全为零,我希望它们不会被显示。所以3,00应显示为:3。所有其他值应与两个摘要一起显示。

我该怎么做?

+2

如果你在处理货币,你应该使用'NSDecimalNumber'而不是'double',因为double不能代表所有的t他完全需要价值。从文档:NSDecimalNumber,一个NSNumber的不可变子类,提供了一个面向对象的包装,用于执行基10算术。双1.01不能完全代表它是:1.01000000000000000888。这个小错误在其他问题之间进行比较时是有意义的。 – zaph

+0

您可以通过将价格四舍五入到最接近的整数来创建一个名为'roundedPrice'的变量,然后将2个小数位应用于'roundedPrice'。然后,如果'price == roundedPrice','numberFormater.maximumFractionDigits = 0',else,'= 2'。这只是我头顶的一些伪代码,但它可能会给你一些想法。 – blwinters

+0

@zaph可以将Double转换为NSDecimalNumber – confile

回答

1

你必须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)") 
+0

但是,如果我不使用NSNumberFormatterStyle.CurrencyStyle我没有得到货币符号 – confile

+0

您可以使用字符串插值添加它 –

+0

您还可以检查字符串是否有后缀“,00”或“。00“,如果为true,则删除最后3个字符 –

0

而不是使用NSNumberFormatter你可以使用NSString的init(格式:参数:)

var string = NSString(format:@"%.2g" arguments:price)

我不擅长与快捷,但这应该工作。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265

+0

这并不总是有效。 – zaph

+0

@ zaph喜欢哪种情况? – quark

+1

一般问题不是格式化,而是使用浮点数,其中一系列计算(每个计算都应该是十进制数)有点关闭,因为实际数不能准确表示,如1.33。这些小错误实际上可能会混合在一起,以便它们在显示时四舍五入并导致错误。关键是在必要时使用小数,例如在3密耳变成完整分的货币计算中。只是舍弃最后的结果是不够的。我用'NSDecimalNumber'写了我的示例计算器,这并不困难。 – zaph