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

时间:2018-06-28 13:44:15

标签: swift nsnumber nsnumberformatter nslocale xcode9.2

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

下面是我的代码

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 个答案:

答案 0 :(得分:2)

十进制分隔符与语言环境有关,因此解析为“ 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 €