【问题标题】:NumberFormatter for currency with symbol only in SwiftNumberFormatter 仅在 Swift 中用于带符号的货币
【发布时间】:2021-04-21 08:26:03
【问题描述】:

我了解NumberFormatter 的默认行为是如果您不在该国家/地区,则将国家/地区代码作为符号的一部分,例如,此测试通过:

func testUSDFromInsideUS() {
    let formatter = NumberFormatter()
    formatter.currencyCode = "USD"
    formatter.numberStyle = .currency
    formatter.locale = Locale(identifier: "en_US")

    XCTAssertEqual("$100.00", formatter.string(from: NSNumber(100)))
}

但是,当区域设置更改为美国以外的国家/地区时,例如 GB,数字格式化程序会将 US 添加到 $ 符号之前:

func testUSDFromOutsideUS() {
    let formatter = NumberFormatter()
    formatter.currencyCode = "USD"
    formatter.numberStyle = .currency
    formatter.locale = Locale(identifier: "en_GB")

    XCTAssertEqual("$100.00", formatter.string(from: NSNumber(100))) // <-- fails because the value is "US$100.00", but I'd like it to be "$100.00".
}

我查看了NumberFormatter 文档,但看不到禁用此行为的属性。我知道这是为了避免与其他 $ 货币混淆。

我是否必须为此编写自己的 NumberFormatter 子类,还是有一种简单的方法来实现这种行为?

【问题讨论】:

  • 我认为自定义格式化程序是必需的。

标签: ios swift numbers nsnumberformatter


【解决方案1】:

这个小技巧应该可以完成这项工作

let formatter = NumberFormatter()
formatter.currencyCode = "USD"
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "en_GB")
formatter.currencySymbol = formatter.currencySymbol

【讨论】:

  • 在我的测试中似乎不起作用。你能详细说明为什么你认为这会奏效吗?如果我在设置语言环境之前复制货币符号之前,它确实有效。所以这是一个很好的解决方法!
猜你喜欢
  • 2013-09-21
  • 1970-01-01
  • 2018-03-08
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2013-10-18
相关资源
最近更新 更多