NSNumberFormatter 的不一致行为

NSNumberFormatter's inconsistent behaviour

当我将 usesSignificantDigits 属性 设置为 true 时,NSNumberFormatter 将不服从 maximumFractionDigits。我认为这也适用于 minimumFractionDigits.

例如:

let formatter: NSNumberFormatter = NSNumberFormatter()
formatter.locale = NSLocale.currentLocale()
formatter.maximumFractionDigits = 2
formatter.allowsFloats = true
formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
formatter.usesSignificantDigits = true

let result = formatter.stringFromNumber(1.2345)

以上代码 returns "1.2345" 作为结果。预期结果是 "1.23"。当我将 usesSignificantDigits 设置为 false 时,它起作用了。

这与 usesSignificantDigits 的开发人员参考中的声明相矛盾:

Determines whether the receiver uses minimum and maximum significant digits properties.

我做错了什么?

属性 usesSignificantDigits 控制 minimumSignificantDigitsmaximumSignificantDigits 的使用,而不是 minimumFractionDigitsmaximumFractionDigits。您没有在代码中设置 maximumSignificantDigits,因此它将使用其默认值(似乎是 6)。

考虑对您的原始代码进行此增强:

let formatter: NSNumberFormatter = NSNumberFormatter()
formatter.locale = NSLocale.currentLocale()
formatter.maximumFractionDigits = 2
formatter.allowsFloats = true
formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle

// Makes formatter use maximumSignificantDigits
formatter.usesSignificantDigits = true

println(formatter.maximumSignificantDigits) // Prints 6

// Will use 6 significant digits, hence "1.2345"
let result = formatter.stringFromNumber(1.2345)

如果您不想使用 maximumSignificantDigits 的值,则不应将 usesSignificantDigits 设置为 true。此行为符合 official documentation.

中的描述
  • 如果 usesSignificantDigitstrue 格式化程序正在使用 minimumSignificantDigitsmaximumSignificantDigits

    minimumSignificantDigits 的默认值为 1。
    maximumSignificantDigits 的默认值为 6。

  • 如果 usesSignificantDigitsfalse 格式化程序正在使用 maximumFractionDigits

所以行为是正确的。