来自 NumberFormatter 的本地化货币符号

Posted

技术标签:

【中文标题】来自 NumberFormatter 的本地化货币符号【英文标题】:Localized currency symbol from NumberFormatter 【发布时间】:2020-05-28 18:24:17 【问题描述】:

如何设置 NumberFormatter 以返回货币符号而不是 iso 符号,而是在 ios 区域设置窗格中可见的本地货币符号。就像波兰货币一样,我需要有“zł”符号而不是“PLN”。

我找不到任何从系统中获取它的方法,因为它不能被硬编码。 IAP 本地化价格也使用“zł”而不是“PLN”

我试过这样:

let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencySymbol = Locale.current.currencySymbol
formatter.maximumFractionDigits = 2

let price = formatter.string(from: (offeringPrice / 12) as NSNumber) ?? ""

但无论我尝试使用什么作为货币符号,我总是得到“PLN”的回报

【问题讨论】:

Locale 可以有 2 个组件,语言和区域。 currencySymbol 可能因地区和语言而异。如果我不设置区域,而只设置语言:Locale(identifier: "pl").currencySymbol 它返回"¤",但如果我同时设置区域和语言:Locale(identifier: "pl-PL").currencySymbol 它返回"zł"。我想知道您是否因为测试设备上未正确设置区域而得到意外结果。 我在设备中设置了语言环境波兰和波兰地区,本地化 IAP 价格返回“zł”所以这有点奇怪 我的应用语言目前只有英文。也许这是原因?和语言环境 en_PL 无论出于何种原因;/ 【参考方案1】:

如果您将formatter.locale 设置为pl_PL,它会起作用:

let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.maximumFractionDigits = 2
formatter.currencyCode = "PLN"

let polandLocale = Locale(identifier: "pl_PL")
let usLocale = Locale(identifier: "en_US")

let offeringPrice = 50.0
let price = (offeringPrice / 12) as NSNumber

formatter.locale = usLocale
formatter.string(from: price) // "PLN 4.17"

formatter.locale = polandLocale
formatter.string(from: price) // "4,17 zł"

【讨论】:

【参考方案2】:

我找到了这个解决方案

    func getCurrencySymbol(from currencyCode: String) -> String? 
        let locale = NSLocale(localeIdentifier: currencyCode)
        if locale.displayName(forKey: .currencySymbol, value: currencyCode) == currencyCode 
            let newlocale = NSLocale(localeIdentifier: currencyCode.dropLast() + "_en")
            return newlocale.displayName(forKey: .currencySymbol, value: currencyCode)
        
        return locale.displayName(forKey: .currencySymbol, value: currencyCode)
    

这里的原始答案:https://***.com/a/49146857/1285959

【讨论】:

以上是关于来自 NumberFormatter 的本地化货币符号的主要内容,如果未能解决你的问题,请参考以下文章

numberformatter(样式货币)删除不起作用

NumberFormatter 在货币模式下对小负数的错误行为

Swift3:类型 numberformatter 没有成员“货币样式”,swift3

NumberFormatter 分组未按预期工作

使用 JSONSerialization 序列化货币时指定小数位数

php numberformatter 显示零