【问题标题】:Using iOS NumberFormatter to format decimal into fraction representation使用 iOS NumberFormatter 将小数格式化为分数表示
【发布时间】:2020-07-21 15:12:45
【问题描述】:

在 iOS 中,如何使用 NumberFormatter 将数字的小数部分格式化为小数形式。

例如,我想将数字2.375 格式化为2 3/8

这可以用 NumberFormatter 完成吗?

【问题讨论】:

    标签: ios swift number-formatting


    【解决方案1】:

    没有。您需要实现自己的 Rational Formatter。您可以使用来自 Martin R 的 answer 作为起点。您可以执行以下操作:

    class RationalFormatter: Formatter {
        let precision: Double = 1.0E-6
        override public func string(for obj: Any?) -> String? {
            guard let value = obj as? Double else { return nil }
            let whole = modf(value).0
            var x = modf(value).1
            var a = x.rounded(.down)
            var (h1, k1, numerator, denominator) = (1, 0, Int(a), 1)
            while x - a > precision * Double(denominator) * Double(denominator) {
                x = 1.0/(x - a)
                a = x.rounded(.down)
                (h1, k1, numerator, denominator) = (numerator, denominator, h1 + Int(a) * numerator, k1 + Int(a) * denominator)
            }
            var string = ""
            if whole < 0 || numerator < 0 {
                string += "-"
            }
            if whole != 0 {
                string += String(Int(abs(whole)))
            }
            if whole != 0 && numerator != 0 {
                string += " "
            }
            if numerator != 0 {
                string += "\(abs(numerator))/\(abs(denominator))"
            }
            return string
        }
    }
    

    用法:

    let double = 2.375
    let rationalFormatter = RationalFormatter()
    let formatted = rationalFormatter.string(for: double)   // "2 3/8"
    

    【讨论】:

      猜你喜欢
      • 2018-07-01
      • 2013-10-18
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 2013-10-25
      • 2011-09-02
      相关资源
      最近更新 更多