如何根据十进制值设置货币格式?

我正在使用NSDecimalNumber来格式化货币,并希望以下input和输出:

9.99 --> 9.99 10 --> 10 10.00 --> 10 9.90 --> 9.90 9.9 --> 9.90 0 --> 0 0.01 --> 0.01 20 --> 20 10.01 --> 10.01

我怎么能在Swift中做到这一点。

编辑:本质上如果有美分(即美分> 0),然后显示美分。 否则,不要。

你的规则是“显示两个小数位,如果其中任何一个都不为零;否则,不显示小数点,也不显示小数点”,我会用最直接的方法来做:

 let number = NSDecimalNumber(string: "12345.00") let formatter = NSNumberFormatter() formatter.positiveFormat = "0.00" let formattedString = formatter.stringFromNumber(number)! .stringByReplacingOccurrencesOfString(".00", withString: "") 

您可以使用NSNumberFormatter的货币格式为此。 但是,似乎并没有一种内置的方式来完成您想要的方式。 这是一个解决方法:

 let formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle func numToCurrency (num: Double) -> String { if floor(num) == num { formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 0 } else { formatter.minimumFractionDigits = 2 formatter.maximumFractionDigits = 2 } return formatter.stringFromNumber(num)! } numToCurrency(9) // "$9" numToCurrency(9.9) // "$9.90" 

检查NSNumberFormatter类的引用以获取更多configuration选项(您可能需要为此格式化程序设置区域设置,以便为当前用户自动使用正确的国际货币符号)。

(在这里回答,作为一个封闭的问题被重新指向这个…)

也许最直接的路线,特别是因为这是“Swift”的标签,是确定它是否是一个整数:

 if value.truncatingRemainder(dividingBy: 1) == 0 { // it's a whole number, // so format WITHOUT decimal places, eg $12 } else { // it's a fraction, // so format WITH decimal places, eg $12.25 } 

额外的好处是避免地区和货币格式的问题…当你在德国时没有search/replace“.00”,例如格式为“,00”

编辑/更新:Xcode 8.3•Swift 3.1

 extension Formatter { static let noFractionDigits: NumberFormatter = { let formatter = NumberFormatter() formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 0 formatter.minimumIntegerDigits = 1 return formatter }() static let twoFractionDigits: NumberFormatter = { let formatter = NumberFormatter() formatter.minimumFractionDigits = 2 formatter.maximumFractionDigits = 2 formatter.minimumIntegerDigits = 1 return formatter }() } extension FloatingPoint { var customDescription: String { return rounded(.down) == self ? Formatter.noFractionDigits.string(for: self) ?? "" : Formatter.twoFractionDigits.string(for: self) ?? "" } } extension String { var double: Double { return Double(self) ?? 0 } } 

 let array = ["9.99","10","10.00","9.90","9.9"] let results = array.map { $0.double.customDescription } results // ["9.99", "10", "10", "9.90", "9.90"] 

以下是如何创build一个自定义的格式化类来处理这个问题:

 import Foundation class CustomFormatter: NSNumberFormatter { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override init() { super.init() self.locale = NSLocale.currentLocale() self.numberStyle = .DecimalStyle } func isIntegerNumber(number:NSNumber) -> Bool { var value: NSDecimal = number.decimalValue if NSDecimalIsNotANumber(&value) { return false } var rounded = NSDecimal() NSDecimalRound(&rounded, &value, 0, NSRoundingMode.RoundPlain) return NSDecimalCompare(&rounded, &value) == NSComparisonResult.OrderedSame } override func stringFromNumber(number: NSNumber) -> String? { if isIntegerNumber(number) { self.minimumFractionDigits = 0 self.maximumFractionDigits = 0 return super.stringFromNumber(number) } else { self.minimumFractionDigits = 2 self.maximumFractionDigits = 2 return super.stringFromNumber(number) } } } let formatter = CustomFormatter() formatter.stringFromNumber(NSDecimalNumber(double: 5.00)) // -> "5" formatter.stringFromNumber(NSDecimalNumber(double: 5.01)) // -> "5.01" formatter.stringFromNumber(NSDecimalNumber(double: 5.10)) // -> "5.10" 

感谢这篇文章的正确方法来testing一个NSDecimal是否是一个整数。

我认为最好让currencyStyle确定maximumFractionDigits。 只要将minimumFractionDigits设置为0就可以了。 代码稍短,但是如果您设置语言环境作为奖励,这种方式将允许没有2位小数的语言。

使用NSNumberFormatter为您提供了货币符号,小数位和逗号的好处,所有这些都是在不同语言环境的完美位置。

 extension NSNumber { func currencyString() -> String? { let formatter = NSNumberFormatter() formatter.numberStyle = .CurrencyStyle if self.isEqualToNumber(self.integerValue) { formatter.minimumFractionDigits = 0 } return formatter.stringFromNumber(self) } } let inputArray: [NSDecimalNumber] = [9.99, 10, 10.00, 9.90, 0, 0.01, 20, 10.01, 0.5, 0.055, 5.0] let outputArray: [String] = inputArray.map({return $0.currencyString() ?? "nil"}) print(outputArray) ["$9.99", "$10", "$10", "$9.90", "$0", "$0.01", "$20", "$10.01", "$0.50", "$0.06", "$5"] 

向NSNumberFormatter添加语言环境如下所示(例如,来自SKProduct对象):

 formatter.locale = product!.priceLocale 

对于OSX应用程序,您需要添加:

 formatter.formatterBehavior = .Behavior10_4