NumberFormatter在使用有效数字时不尊重minimumFractionDigits

时间:2018-04-03 07:25:07

标签: ios swift number-formatting nsnumberformatter

我想使用以下规则格式化并显示Double

  

如果有超过2个小数位数,则将其显示为6   有效数字,否则只显示其原始值至少2个小数位。

为了根据我的需要格式化数字,我使用以下方法声明了扩展名:

extension NSNumber {
    func significantFormattedString(minimum: Int = 2, maximum: Int = 6) -> String {
        let formatter = NumberFormatter()
        formatter.locale = Locale(identifier: "en_US")
        formatter.minimumSignificantDigits = minimum
        formatter.maximumSignificantDigits = maximum
        formatter.minimumFractionDigits = 2
        formatter.usesGroupingSeparator = true
        formatter.minimumIntegerDigits = 1
        formatter.numberStyle = .decimal

        return formatter.string(from: self) ?? "-"
    }
}

然后在使用以下代码进行测试时:

let myNumber = NSNumber(value: 7568.9)
let myString = myNumber.significantFormattedString()
print("\(myString)") // prints "7,568.9"

如果我注释掉指定minimumSignificantDigitsmaximumSignificantDigits的行,它会按预期工作(即显示至少2个小数位,“7,568.90”)

有没有达到我想要的结果,或者我只能再次格式化结果?

谢谢!

1 个答案:

答案 0 :(得分:1)

你说"如果有超过2个小数位"。一个号码不能"有" 2个小数位。您可以向数字添加无限数量的小数位(0),该值不会更改。您将实际值与格式字符串混淆。

你的真正含义可能是"如果数字的100倍是一个整数"。为此,您需要一个if语句:

let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
formatter.usesGroupingSeparator = true
formatter.minimumIntegerDigits = 1
formatter.numberStyle = .decimal
// this checks if the number has two leading fractional digits that are not zero
if (a * pow(10, minimum)).truncatingRemainder(dividingBy: 1) == 0 {
    formatter.minimumFractionDigits = minimum
} else {
    formatter.minimumSignificantDigits = maximum
}
return formatter.string(from: self) ?? "-"