在Swift中与NSNumberFormatter挣扎货币

我正在创build一个预算应用程序,允许用户input他们的预算以及交易。 我需要允许用户从单独的文本字段input便士和磅,他们需要与货币符号一起格式化。 目前我的工作状态良好,但是希望将其作为目前的本地化版本,只适用于英镑。 我一直在努力把NSNumberFormatter的例子从Objective C转换到Swift。

我的第一个问题是,我需要将input字段的占位符设置为特定于用户的位置。 例如。 英镑和便士,美元和美分等

第二个问题是需要格式化每个文本字段(如10216和32)中input的值,并且需要添加特定于用户位置的货币符号。 所以它会变成10,216.32英镑或者10,216.32美元等等。

另外,我需要在计算中使用格式化数字的结果。 那么,如何解决这个问题而不会遇到问题而不会遇到货币符号的问题呢?

任何帮助将不胜感激。

下面是一个关于如何在Swift 3上使用它的例子。( 编辑 :在Swift 4中也可以)

let price = 123.436 as NSNumber let formatter = NumberFormatter() formatter.numberStyle = .currency // formatter.locale = NSLocale.currentLocale() // This is the default // In Swift 4, this ^ has been renamed to simply NSLocale.current formatter.string(from: price) // "$123.44" formatter.locale = Locale(identifier: "es_CL") formatter.string(from: price) // $123" formatter.locale = Locale(identifier: "es_ES") formatter.string(from: price) // "123,44 €" 

这里是关于如何在Swift 2上使用它的旧例子。

 let price = 123.436 let formatter = NSNumberFormatter() formatter.numberStyle = .CurrencyStyle // formatter.locale = NSLocale.currentLocale() // This is the default formatter.stringFromNumber(price) // "$123.44" formatter.locale = NSLocale(localeIdentifier: "es_CL") formatter.stringFromNumber(price) // $123" formatter.locale = NSLocale(localeIdentifier: "es_ES") formatter.stringFromNumber(price) // "123,44 €" 

我已经实施了@NiñoScript提供的解决scheme作为扩展:

延期

 // Create a string with currency formatting based on the device locale // extension Float { var asLocaleCurrency:String { var formatter = NSNumberFormatter() formatter.numberStyle = .CurrencyStyle formatter.locale = NSLocale.currentLocale() return formatter.stringFromNumber(self)! } } 

用法:

 let amount = 100.07 let amountString = amount.asLocaleCurrency print(amount.asLocaleCurrency()) // prints: "$100.07" 

Swift 3

  extension Float { var asLocaleCurrency:String { var formatter = NumberFormatter() formatter.numberStyle = .currency formatter.locale = Locale.current return formatter.string(from: self)! } } 

Swift 3:

如果你正在寻找一个解决scheme,给你:

  • “5”=“$ 5”
  • “5.0”=“$ 5”
  • “5.00”=“$ 5”
  • “5.5”=“$ 5.50”
  • “5.50”=“$ 5.50”
  • “5.55”=“5.55美元”
  • “5.234234”=“5.23”

请使用以下内容:

 func cleanDollars(_ value: String?) -> String { guard value != nil else { return "$0.00" } let doubleValue = Double(value!) ?? 0.0 let formatter = NumberFormatter() formatter.currencyCode = "USD" formatter.currencySymbol = "$" formatter.minimumFractionDigits = (value!.contains(".00")) ? 0 : 2 formatter.maximumFractionDigits = 2 formatter.numberStyle = .currencyAccounting return formatter.string(from: NSNumber(value: doubleValue)) ?? "$\(doubleValue)" } 

Xcode 9•Swift 4

 extension NumberFormatter { convenience init(style: Style) { self.init() numberStyle = style } } extension Formatter { static let currency = NumberFormatter(style: .currency) static let currencyUS: NumberFormatter = { let formatter = NumberFormatter(style: .currency) formatter.locale = Locale(identifier: "en_US") return formatter }() static let currencyBR: NumberFormatter = { let formatter = NumberFormatter(style: .currency) formatter.locale = Locale(identifier: "pt_BR") return formatter }() } extension Numeric { // for Swift 3 use FloatingPoint or Int var currency: String { return Formatter.currency.string(for: self) ?? "" } var currencyUS: String { return Formatter.currencyUS.string(for: self) ?? "" } var currencyBR: String { return Formatter.currencyBR.string(for: self) ?? "" } } 

 let price = 1.99 print(Formatter.currency.locale) // "en_US (current)\n" print(price.currency) // "$1.99\n" Formatter.currency.locale = Locale(identifier: "pt_BR") print(price.currency) // "R$1,99\n" Formatter.currency.locale = Locale(identifier: "en_UK") print(price.currency) // "£1.99\n" print(price.currencyBR) // "R$1,99\n" print(price.currencyUS) // "$1.99\n" 
 extension Float { var convertAsLocaleCurrency :String { var formatter = NumberFormatter() formatter.numberStyle = .currency formatter.locale = Locale.current return formatter.string(from: self as NSNumber)! } } 

这工作迅速3.1 xcode 8.2.1