【问题标题】:Changing grouping separator, currency symbol and position of currency symbol for multiple currencies in Swift在 Swift 中更改多种货币的分组分隔符、货币符号和货币符号的位置
【发布时间】:2016-01-16 21:50:06
【问题描述】:

我的应用使用多种货币,而这些货币使用不同的格式,例如:

卢布的价格显示为:1,101 Руб.

美元的相同金额显示为:US $1 101

如何通过为不同的货币定义一组不同的格式来更改分组分隔符、货币符号和货币符号的位置。

这就是我的短代码的样子

var formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.locale = NSLocale.currentLocale()
formatter.stringFromNumber(4500000)
//Output : $4,500,000.00
//Expected : 4,500,000 Руб.

【问题讨论】:

  • 作为一个 3 岁的会员,你应该知道它不是一个语言转换网站。您说您正在使用 Swift,但我在您的帖子中看不到任何 Swift 代码。
  • 首先格式化程序不需要是变量。您应该使用 let 将其声明为常量。您也可以从您的问题中删除 Android 代码。您还应该包括您正在输入的数字(价格)声明类型和值以及预期的字符串结果
  • "我无法更改分组分隔符、货币符号和货币符号的位置" 您不需要。语言环境会为您解决这个问题。但是,如果您确实需要,您是否阅读 NSNumberFormatter 文档?我什至没有看到你尝试更改格式或货币代码。
  • @Aamir 您可以使用当前区域设置的货币符号,也可以指定要格式化您的货币的区域设置。你想做什么?请注意,用户可能在其设备上使用不同的区域设置。因为它,我在我的机器上得到了 $ 而不是 R$ 符号
  • “NSNumberFormatter 文档在 Swift 中不可用”?那是个笑话,对吧?开发环境不是 Swift 而是 Xcode,而且 NSNumberFormatter 肯定在 Xcode 中可用的文档中。也可在线获取:developer.apple.com/library/ios/documentation/Cocoa/Reference/…

标签: ios swift nsnumberformatter


【解决方案1】:

Swift 4 或更高版本

extension Formatter {
    static let belarusianRuble: NumberFormatter = {
        let formatter = NumberFormatter()
        // set the numberStyle to .CurrencyStyle
        formatter.numberStyle = .currency
        // set the desired negative and positive formats grouping, and currency symbol position
        formatter.positiveFormat = "#,##0 ¤"
        formatter.negativeFormat = "-#,##0 ¤"
        // set your custom currency symbol
        formatter.currencySymbol = "Руб"
        return formatter
    }()
}

let stringToDisplay = Formatter.belarusianRuble.string(for: 4500000)  // "4,500,000 Руб"

extension Formatter {
    static let currencyBYR: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.positiveFormat = "#,##0 ¤"
        formatter.negativeFormat = "-#,##0 ¤"
        formatter.currencySymbol = "Руб"
        return formatter
    }()
    static let currencyEUR: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.locale = Locale(identifier: "pt_PT")
        formatter.numberStyle = .currency
        return formatter
    }()
    static let currencyUSD: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.locale = Locale(identifier: "en_US")
        formatter.numberStyle = .currency
        return formatter
    }()
    static let currencyBRL: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.locale = Locale(identifier: "pt_BR")
        formatter.numberStyle = .currency
        return formatter
    }()
    static let currencyRUB: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.locale = Locale(identifier: "ru_RU")
        formatter.numberStyle = .currency
        formatter.maximumFractionDigits = 0
        return formatter
    }()
    static let currencyLocale: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.locale = .current
        formatter.numberStyle = .currency
        return formatter
    }()
}

extension Numeric {
    var currencyLocale: String { return Formatter.currencyLocale.string(for: self) ?? "" }
    var currencyUSD: String { return Formatter.currencyUSD.string(for: self) ?? "" }
    var currencyEUR: String { return Formatter.currencyEUR.string(for: self) ?? "" }
    var currencyBYR: String { return Formatter.currencyBYR.string(for: self) ?? "" }
    var currencyBRL: String { return Formatter.currencyBRL.string(for: self) ?? "" }
    var currencyRUB: String { return Formatter.currencyRUB.string(for: self) ?? "" }
}

用法

let amount = 4500000.0

let stringLocale = amount.currencyLocale   // "$4,500,000.00"

let stringUSD = amount.currencyUSD         // "$4,500,000.00"
let stringEUR = amount.currencyEUR         // "4 500 000,00 €"
let stringBRL = amount.currencyBRL         // "R$ 4.500.000,00"
let stringBYR = amount.currencyBYR         // "4,500,000 Руб"
let stringRUB = amount.currencyRUB         // "4 500 000 ₽"

【讨论】:

    【解决方案2】:

    我最终得到了使用当前语言环境小数/千/分组分隔符的 Currency 类(感谢 cmets 中的 @jcaron 推荐)

    该课程提供的自定义很少,适合我的任务:

    • 货币符号
    • 最小/最大小数位数
    • 左/右定位符号

    class Currency {
        var formatter = NumberFormatter()
        var symbol: String
        var isRTL: Bool
    
        init(_ currencySymbol: String, minFractionDigits: Int, maxFractionDigits: Int, isRTL: Bool) {
            self.formatter.currencySymbol = ""
            self.formatter.minimumFractionDigits = minFractionDigits
            self.formatter.maximumFractionDigits = maxFractionDigits
            self.formatter.numberStyle = .currency
    
            self.symbol = currencySymbol
            self.isRTL = isRTL
        }
    
        func beautify(_ price: Double) -> String {
            let str = self.formatter.string(from: NSNumber(value: price))!
            if self.isRTL {
                return str + self.symbol
            }
            return self.symbol + str
        }
    }
    

    初始化所需的格式化程序

    struct CurrencyFormatter {
        static let byr = Currency(" Руб.", minFractionDigits: 2, maxFractionDigits: 2, isRTL: true)
        static let usd = Currency("US $", minFractionDigits: 2, maxFractionDigits: 2, isRTL: false)
        static let rub = Currency("\u{20BD} ", minFractionDigits: 0, maxFractionDigits: 1, isRTL: false)
    }
    

    用法

    CurrencyFormatter.byr.beautify(12345.67) // Output: 12 345,67 Руб.
    CurrencyFormatter.usd.beautify(12345.67) // Output: US $12 345,67
    CurrencyFormatter.rub.beautify(12345.67) // Output: ₽ 12 345,7
    

    【讨论】:

    • 您应该只使用 struct 和 static let 初始化您的数字格式化程序一次。你应该使用 Double 而不是 Float
    猜你喜欢
    • 2019-02-23
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2013-07-03
    • 2014-12-07
    • 2017-06-22
    相关资源
    最近更新 更多