使用 iOS NumberFormatter 将小数格式化为分数表示
Using iOS NumberFormatter to format decimal into fraction representation
在iOS中,如何使用 NumberFormatter 将数字的小数部分格式化为小数部分。
例如,我想将数字 2.375
格式化为 2 3/8
。
这可以用 NumberFormatter 完成吗?
没有。您将需要实施您自己的 Rational Formatter。您可以使用 Martin R 的 作为起点。你可以这样做:
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"
在iOS中,如何使用 NumberFormatter 将数字的小数部分格式化为小数部分。
例如,我想将数字 2.375
格式化为 2 3/8
。
这可以用 NumberFormatter 完成吗?
没有。您将需要实施您自己的 Rational Formatter。您可以使用 Martin R 的
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"