NSNumberFormatter只显示“E”表示大/小值?

时间:2016-03-26 16:08:43

标签: swift macos nsnumberformatter

我有一个NSTableView,我填充了数字。这些通常是我可以正常显示的数字,如“1”或“15”。但是,它们的一部分总是非常大或很小,比如“1.5E8”。

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

enter image description here

那些“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)!

1 个答案:

答案 0 :(得分:1)

我不是自称是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("\($0) --> \(measurementFormatter.stringFromNumber($0)!)")
}

输出:

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