【问题标题】:Swift: maximumFractionDigits not working as expected when changing currencySwift:maximumFractionDigits 在更改货币时无法按预期工作
【发布时间】:2020-06-05 05:25:14
【问题描述】:

我正在使用带有货币 numberStyle 的 Swift 的 NumberFormatter。 我设置了以下属性:

let value: Double = 345.23
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 0
formatter.locale = Locale(identifier: "en_US")
formatter.currencyCode = "USD"
print(formatter.string(from: NSNumber(value: value))) //Will print $345 as expected

如果我更改货币并再次打印,我会得到两位小数。为什么?

formatter.currencyCode = "EUR"
print(formatter.string(from: NSNumber(value: value))) //Will print €345.23 with two decimals

这是应该发生的还是一个错误? 如果我将语言环境更改为其他内容,例如“fr_FR”,然后再次返回“en_US”,它将以 0 位小数打印。请参阅 XCTestCase 的附加结果。只有修改了区域设置后,货币才会具有预期的小数位数。

更新:它适用于 iOS 13.3,但不适用于 iOS 12.0 和 11.0.1

【问题讨论】:

  • 我无法重现此内容。我得到没有小数位的“€345”
  • 好的。感谢您的反馈意见!这让我在不同的操作系统上进行了测试,我发现它适用于 iOS 13.3,但不适用于 iOS 11.01 和 iOS 12.0。
  • 您应该在设置其他属性之前设置您的区域设置。当您设置语言环境时,它将为许多格式化程序属性设置默认值。 语言环境决定了许多格式化程序属性的默认值,例如 ISO 国家和语言代码、货币代码、日历、测量系统和小数分隔符。
  • 有什么理由不用Decimal来代表你的价值?相关:stackoverflow.com/questions/3730019/…
  • 感谢您的回复,Leo Dabus。即使我首先设置了语言环境,但一旦我更改了currencyCode,格式化就会失败。但如上所述,它只发生在 iOS

标签: swift locale currency numberformatter


【解决方案1】:

如果您在不更改 minimumFractionDigitsmaximumFractionDigits 的情况下执行代码,您会注意到这些设置已使用与每种货币关联的默认值重新初始化:

// My favourite test currencies with 2, 3, 2 and 0 decimals
for mycur in ["USD", "TND", "EUR", "JPY" ] {
    myformatter.currencyCode = mycur
    print ("cur:\(mycur): min:\(myformatter.minimumFractionDigits) max:\(myformatter.maximumFractionDigits) result:\(myformatter.string(from: NSNumber(value: value)) ?? "xxx")")
}

此代码产生以下结果:

cur:USD: min:2 max:2 result:$345.23
cur:TND: min:3 max:3 result:TND 345.230
cur:EUR: min:2 max:2 result:€345.23
cur:JPY: min:0 max:0 result:¥345

这些设置会在您为NumberFormatter 选择货币样式并使用默认语言环境的货币设置时立即初始化。而且每次更改区域设置也可能会更改货币以及这些相关设置。

现在我无法用我当前安装的版本重现您的问题:只要我更改一次 minimumFractionDigitsmaximumFractionDigits,无论货币如何变化,它都会保留新设置。 (此行为也与当前货币的设置或默认设置无关)。

但是看你的问题描述,很有可能NumberFormatter在之前版本的设置显式更改中没有跟踪,并且它在每次货币更改时系统地重新加载默认货币设置.

一种独立于版本的解决方法是在您每次更改区域设置或货币时重新应用您的临时设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2013-12-23
    • 2014-12-09
    • 2016-01-13
    • 2020-09-21
    • 2011-08-17
    • 2012-04-29
    相关资源
    最近更新 更多