Swift: 如何包含或使用 darwin compactdecimalformat?

Swift: How do I include or use darwin compactdecimalformat?

我一直在研究并尝试在 Swift.

中编写一种紧凑的数字格式,也称为短比例格式化程序或将大数字人性化为较小的数字。

我突然想到而不是尝试重新编码轮子也许 Unicode 已经解决了这个问题并且看到确实有一些代码可以压缩更大的数字。

在 Github 上的 Apple Swift 开源代码中有对 compactdecimalformat.h 的引用:

https://github.com/apple/swift-corelibs-foundation/blob/master/bootstrap/x86_64-apple-darwin/usr/local/include/unicode/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"