NSNumberFormatter 只显示 "E" 的 large/small 值?

NSNumberFormatter only display "E" for large/small values?

我有一个用数字填充的 NSTableView。这些通常是我可以正常显示的数字,例如“1”或“15”。但是,其中的一个子集总是很大或很小,例如“1.5E8”。

我做了一个 NSNumberFormatter 单例,所以我可以使用 stringFromNumber 来格式化它们,但似乎我只能打开或关闭 E:

那些“0E0”是没有用的,它们应该只是“0”。不过,似乎 没有为此设置。我是不是漏掉了什么?

或者您是否总是必须在代码中执行此操作?

这是我的文档子类中的设置代码:

var measurementFormatter: NSNumberFormatter = NSNumberFormatter()
measurementFormatter.locale = NSLocale.currentLocale()
measurementFormatter.numberStyle = .ScientificStyle
measurementFormatter.alwaysShowsDecimalSeparator = true
measurementFormatter.minimumFractionDigits = 0
measurementFormatter.maximumFractionDigits = 6
measurementFormatter.generatesDecimalNumbers = false

一个例子使用:

numStr = (document?.measurementFormatter.stringFromNumber(num)!

我不自称是 NSNumberFormatter 专家 - 有太多选项需要记住。但是设置 zeroSymbol 似乎可以解决你的问题:

measurementFormatter.zeroSymbol = "0"

编辑: 今晚我在这上面花了太多时间。似乎没有办法摆脱那些 E0,所以我决定继承 NSNumberFormatter

class MyNumberFormatter: NSNumberFormatter {
    override func stringFromNumber(number: NSNumber) -> String? {
        guard let str = super.stringFromNumber(number) else {
            return nil
        }
        return str.stringByReplacingOccurrencesOfString("E0", withString: "", options: [.AnchoredSearch, .BackwardsSearch], range: str.startIndex..<str.endIndex)
    }
}

var measurementFormatter = MyNumberFormatter()
measurementFormatter.locale = NSLocale.currentLocale()
measurementFormatter.numberStyle = .ScientificStyle
measurementFormatter.alwaysShowsDecimalSeparator = true
measurementFormatter.minimumFractionDigits = 0
measurementFormatter.maximumFractionDigits = 6
measurementFormatter.generatesDecimalNumbers = false

// Examples:
[0, 0.0014, 2, 15, 3.14, 100, 1500000000].forEach {
    print("\([=11=]) --> \(measurementFormatter.stringFromNumber([=11=])!)")
}

输出:

0 --> 0
0.0014 --> 1.4E-3
2 --> 2
15 --> 1.5E1
3.14 --> 3.14
100 --> 1E2
1500000000 --> 1.5E9