Quiero formatear decimales para tener cuatro números distintos de cero después del 0. final. Por ejemplo, 0.001765 o 0.00004839.
Cualquier número por encima de 1 simplemente tendría dos decimales. Por ejemplo, 2.23.
Me pregunto si puedo lograr esto usando NumberFormatter?
3 respuestas
Tienes dos condiciones. Use minimumSignificantDigits
y maximumSignificantDigits
para los 4 dígitos y use maximumFractionDigits
para los 2 lugares para valores superiores a 1.
extension FloatingPoint {
func specialFormat() -> String {
let fmt = NumberFormatter()
fmt.numberStyle = .decimal
if abs(self) >= 1 {
// adjust as needed
fmt.maximumFractionDigits = 2
} else {
fmt.minimumSignificantDigits = 4
fmt.maximumSignificantDigits = 4
}
return fmt.string(for: self)!
}
}
print(0.001765345.specialFormat())
print(0.00004839643.specialFormat())
print(1.2345.specialFormat())
Salida:
0.001765
0.00004840
1,23
Use la propiedad maximumSignificantDigits
.
let nf = NumberFormatter()
nf.maximumSignificantDigits = 4
print(nf.string(for: 0.00000232323)!)
// prints 0.000002323
print(nf.string(for: 2.3)!)
// prints 2.3
Utilicé una combinación de las respuestas / comentarios recibidos para resolver este problema de manera óptima.
Primero, los dos formateadores necesarios como propiedades estáticas a través de una extensión (como lo sugiere Leo).
extension Formatter {
static let twoDecimals: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter
}()
static let fourSigDigits: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumSignificantDigits = 4
formatter.maximumSignificantDigits = 4
return formatter
}()
}
Luego, una extensión para aplicar condicionalmente el formateador adecuado (como sugiere rmaddy):
extension FloatingPoint {
var currencyFormat: String {
return abs(self) >= 1 ?
Formatter.twoDecimals.string(for: self) ?? "" :
Formatter.fourSigDigits.string(for: self) ?? ""
}
}
Finalmente, puedes usarlo así:
let eth = 1200.123456
let xrp = 1.23456789
let trx = 0.07891234
eth.currencyFormat //"1200.12"
xrp.currencyFormat //"1.23"
trx.currencyFormat //"0.07891"
Preguntas relacionadas
Nuevas preguntas
ios
iOS es el sistema operativo móvil que se ejecuta en el iPhone, iPod touch y iPad de Apple. Use esta etiqueta [ios] para preguntas relacionadas con la programación en la plataforma iOS. Use las etiquetas relacionadas [Objective-C] y [Swift] para problemas específicos de esos lenguajes de programación.