Я пытаюсь создать строку, представляющую UInt64.max, используя NumberFormatter. Вот код:
let formatter = NumberFormatter()
formatter.usesGroupingSeparator = true
formatter.numberStyle = .decimal
formatter.positiveFormat = "# ##0.#########"
formatter.maximumSignificantDigits = 20
formatter.usesSignificantDigits = false
formatter.maximumFractionDigits = 20
formatter.minimumFractionDigits = 0
formatter.alwaysShowsDecimalSeparator = false
// formatter.roundingMode = .halfUp
let text1 = formatter.string(for: NSNumber(value: Int64.max))
let text2 = formatter.string(for: NSNumber(value: UInt64.max))
print(text1)
print(text2)
который печатает:
Optional("9,223,372,036,854,780,000")
Optional("-1")
но должен печатать
Optional("9223372036854775807")
Optional("18,446,744,073,709,551,615")
Похоже, NSNumber округляет Int64 и не берет UIn64. Версия obj-c NSNumberFormatter работает нормально.
Я что-то упустил или проблема с NumberFormatter?





Немного повозившись, нашел решение:
let text2 = formatter.string(for: Decimal(UInt64.max))
print(text2)
Это печатает Optional("18,446,744,073,709,600,000")
Обратите внимание, что значение UInt.max равно "18,446,744,073,709,551,615", а не "18,446,744,073,709,600,000".
Вы можете использовать новый форматированныйGeneric Instance Method и указать стиль number:
iOS15+ • Xcode 13
let decimal1 = Decimal(Int64.max)
let decimal2 = Decimal(UInt64.max)
let text1 = decimal1.formatted(.number)
let text2 = decimal2.formatted(.number)
print(text1)
print(text2)
Это напечатает
9,223,372,036,854,775,807
18,446,744,073,709,551,615
Признаю, что это ново для меня, но нашел некоторые детали, которые заставляют задуматься над этим. Подробнее здесь. Спасибо!
@ Phantom59 Извините, я разместил неправильную ссылку. К сожалению, документация очень плохая. developer.apple.com/documentation/foundation/decimal/…
Очень хорошо. Мой творческий дух не зашел так далеко! Спасибо!