Swift: 如何包含或使用 darwin compactdecimalformat?
Swift: How do I include or use darwin compactdecimalformat?
我一直在研究并尝试在 Swift.
中编写一种紧凑的数字格式,也称为短比例格式化程序或将大数字人性化为较小的数字。
我突然想到而不是尝试重新编码轮子也许 Unicode
已经解决了这个问题并且看到确实有一些代码可以压缩更大的数字。
在 Github 上的 Apple Swift 开源代码中有对 compactdecimalformat.h
的引用:
里面,指的是numberformatter.h;我在 Unicode ICU 67.1 找到了一个参考:
https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/numberformatter_8h.html
但是,我不确定如何使用它。我导入了达尔文,但我不确定如何实际调用 compactdecimalformat
或 public 标识符 DecimalFormat
我想 运行 对它进行一些数字测试,看看它是否是我正在寻找的压缩/短缩放数字。
因此我的问题是,如何包含和使用作为 Darwin 导入的一部分的 compactdecimalnumber.h 文件?
谢谢
编辑:我认为在阅读代码和注释后,.h 文件只能处理非常大的数字?
我认为 Swift 中没有这样的格式化程序,但如果需要,您可以将 NumberFormatter 子类化并创建自己的 CompactNumberFormatter:
class CompactDecimalFormatter: NumberFormatter {
override func string(for obj: Any?) -> String? {
guard var value = (obj as? NSNumber)?.doubleValue else { return nil }
let suffixes = ["", "k", "m", "b","t"]
var index = suffixes.startIndex
while index < suffixes.endIndex && value.magnitude >= 1000 {
index = suffixes.index(after: index)
value /= 1000
}
formatter.positiveSuffix = suffixes[index]
formatter.negativeSuffix = suffixes[index]
return formatter.string(for: value)
}
private let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.roundingMode = .down
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 1
return formatter
}()
// You can override all the properties you thing you might need
override var minimumIntegerDigits: Int {
get { formatter.minimumIntegerDigits }
set { formatter.minimumIntegerDigits = newValue }
}
override var maximumIntegerDigits: Int {
get { formatter.maximumIntegerDigits }
set { formatter.maximumIntegerDigits = newValue }
}
override var minimumFractionDigits: Int {
get { formatter.minimumFractionDigits }
set { formatter.minimumFractionDigits = newValue }
}
override var maximumFractionDigits: Int {
get { formatter.maximumFractionDigits }
set { formatter.maximumFractionDigits = newValue }
}
override var positivePrefix: String! {
get { formatter.positivePrefix }
set { formatter.positivePrefix = newValue }
}
override var negativePrefix: String! {
get { formatter.negativePrefix }
set { formatter.negativePrefix = newValue }
}
override var roundingMode: RoundingMode {
get{ formatter.roundingMode }
set{ formatter.roundingMode = newValue }
}
// or disable them
override var numberStyle: Style { get { .decimal } set { } }
override var positiveSuffix: String! { get { "" } set { } }
override var negativeSuffix: String! { get { "" } set { } }
}
let formatter = CompactDecimalFormatter()
formatter.string(for: 2500) // "2.5k"
我一直在研究并尝试在 Swift.
中编写一种紧凑的数字格式,也称为短比例格式化程序或将大数字人性化为较小的数字。我突然想到而不是尝试重新编码轮子也许 Unicode
已经解决了这个问题并且看到确实有一些代码可以压缩更大的数字。
在 Github 上的 Apple Swift 开源代码中有对 compactdecimalformat.h
的引用:
里面,指的是numberformatter.h;我在 Unicode ICU 67.1 找到了一个参考:
https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/numberformatter_8h.html
但是,我不确定如何使用它。我导入了达尔文,但我不确定如何实际调用 compactdecimalformat
或 public 标识符 DecimalFormat
我想 运行 对它进行一些数字测试,看看它是否是我正在寻找的压缩/短缩放数字。
因此我的问题是,如何包含和使用作为 Darwin 导入的一部分的 compactdecimalnumber.h 文件?
谢谢
编辑:我认为在阅读代码和注释后,.h 文件只能处理非常大的数字?
我认为 Swift 中没有这样的格式化程序,但如果需要,您可以将 NumberFormatter 子类化并创建自己的 CompactNumberFormatter:
class CompactDecimalFormatter: NumberFormatter {
override func string(for obj: Any?) -> String? {
guard var value = (obj as? NSNumber)?.doubleValue else { return nil }
let suffixes = ["", "k", "m", "b","t"]
var index = suffixes.startIndex
while index < suffixes.endIndex && value.magnitude >= 1000 {
index = suffixes.index(after: index)
value /= 1000
}
formatter.positiveSuffix = suffixes[index]
formatter.negativeSuffix = suffixes[index]
return formatter.string(for: value)
}
private let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.roundingMode = .down
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 1
return formatter
}()
// You can override all the properties you thing you might need
override var minimumIntegerDigits: Int {
get { formatter.minimumIntegerDigits }
set { formatter.minimumIntegerDigits = newValue }
}
override var maximumIntegerDigits: Int {
get { formatter.maximumIntegerDigits }
set { formatter.maximumIntegerDigits = newValue }
}
override var minimumFractionDigits: Int {
get { formatter.minimumFractionDigits }
set { formatter.minimumFractionDigits = newValue }
}
override var maximumFractionDigits: Int {
get { formatter.maximumFractionDigits }
set { formatter.maximumFractionDigits = newValue }
}
override var positivePrefix: String! {
get { formatter.positivePrefix }
set { formatter.positivePrefix = newValue }
}
override var negativePrefix: String! {
get { formatter.negativePrefix }
set { formatter.negativePrefix = newValue }
}
override var roundingMode: RoundingMode {
get{ formatter.roundingMode }
set{ formatter.roundingMode = newValue }
}
// or disable them
override var numberStyle: Style { get { .decimal } set { } }
override var positiveSuffix: String! { get { "" } set { } }
override var negativeSuffix: String! { get { "" } set { } }
}
let formatter = CompactDecimalFormatter()
formatter.string(for: 2500) // "2.5k"