Использование iOS NumberFormatter для форматирования десятичного числа в дробное представление - PullRequest
0 голосов
/ 09 апреля 2020

В iOS как можно использовать NumberFormatter для форматирования десятичной части числа в его дробные представления.

Например, я хотел бы отформатировать число 2.375 как 2 3/8.

Можно ли это сделать с помощью NumberFormatter?

1 Ответ

1 голос
/ 09 апреля 2020

Нет. Вам нужно будет реализовать свой собственный Rational Formatter. Вы можете использовать этот ответ от Мартина Р. в качестве отправной точки. Вы можете сделать что-то вроде:

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"
...