货币格式的 NSNumberFormatter.number 在设备中不起作用但在模拟器中起作用

Posted

技术标签:

【中文标题】货币格式的 NSNumberFormatter.number 在设备中不起作用但在模拟器中起作用【英文标题】:NSNumberFormatter.number for currency format not working in Device but works in simulator 【发布时间】:2018-06-28 13:44:15 【问题描述】:

我一直在尝试基于传递我的自定义语言标识符来实现货币格式。

下面是我的代码

func currencyFormatter(language:String, amount:String)  -> String  

    let nsFormatter = NumberFormatter()
    nsFormatter.numberStyle = .currency
    nsFormatter.currencySymbol = ""
    var formattedString: String?
    var amountInNumber:NSNumber!
    if let number = nsFormatter.number(from: amount)
    
        amountInNumber = number.doubleValue as NSNumber
    
    nsFormatter.locale = Locale(identifier: language)
    formattedString = ((amountInNumber?.intValue) != nil) ? nsFormatter.string(from: amountInNumber) : amount

    guard let finalString = formattedString else 
        return ""
    
    return finalString

我正在尝试将语言传递为“fr-FR”并将数量传递为“1234.45”,然后期望输出为“1 234,45”。

这在模拟器中工作正常,但在设备中不工作(返回相同的值 1234.45)

我错过了什么吗?请帮忙!

提前致谢

【问题讨论】:

【参考方案1】:

小数点分隔符取决于区域设置,因此解析“1234.45” 如果语言环境的分隔符不是句点,则失败。

输入字符串使用固定格式,以句点作为小数分隔符 然后您可以将格式化程序的语言环境设置为“en_US_POSIX”以进行转换 从字符串到数字。然后将其设置为转换所需的语言环境 从数字到字符串。

例子:

func currencyFormatter(language: String, amount: String)  -> String  

    let nsFormatter = NumberFormatter()
    nsFormatter.locale = Locale(identifier: "en_US_POSIX")
    nsFormatter.numberStyle = .decimal

    guard let number = nsFormatter.number(from: amount) else 
        return amount
    

    nsFormatter.locale = Locale(identifier: language)
    nsFormatter.numberStyle = .currency

    return nsFormatter.string(from: number) ?? amount


print(currencyFormatter(language: "fr-FR", amount: "1234.45"))
// 1 234,45 €

【讨论】:

以上是关于货币格式的 NSNumberFormatter.number 在设备中不起作用但在模拟器中起作用的主要内容,如果未能解决你的问题,请参考以下文章

用货币符号在前面格式化货币

如何仅使用货币代码将数字格式化为货币?

将货币更改为货币格式化程序

Excel 互操作货币格式

显示的货币格式

使用不带货币符号的 Intl.NumberFormat 进行货币格式化