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
我有一个用数字填充的 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