Если вам нужно использовать строки формата printf
, я бы не советовал использовать NumberFormatter
. Он не предназначен для этого. Просто используйте String(format:_:)
. Вы, кажется, неохотно делаете это, но не понятно почему.
Так что я мог бы предложить:
func convert(format: String, _ value: Float) -> Float? {
let string = String(format: format, value)
return Float(string)
}
Вы сказали:
Пример: 12.3456 (с плавающей точкой) с "% 6.3f" (формат C в виде строки) должен превратиться в 12.345 (также с плавающей точкой)
Просто чтобы прояснить, следующее выдаст 12.346
, а не 12.345
. Формат printf
- строки круглые, а не усеченные.
let value: Float = 12.3456
print(convert(format: "%6.3f", value) ?? "Unable to convert")
Кстати, если вам нужно точное представление значения, представленного в формате printf
, вместо генерации типа с плавающей запятой, вы можете сгенерировать Decimal
:
func convert(format: String, _ value: Double) -> Decimal? {
let string = String(format: format, value)
return Decimal(string: string)
}
Это просто зависит от того, что вы делаете с этим окончательным результатом. Я также изменил это, чтобы использовать Double
, так как очень легко превысить скудную точность 7 десятичных цифр, разрешенную Float
.