Respuestas:
No es casting, está creando una cadena a partir de un valor con un formato.
let a: Double = 1.5
let b: String = String(format: "%f", a)
print("b: \(b)") // b: 1.500000
Con un formato diferente:
let c: String = String(format: "%.1f", a)
print("c: \(c)") // c: 1.5
También puede omitir la format
propiedad si no se necesita formato.
format:"%.1f" = 1 digit // 1.5
; format:"%.5f" = 5 digits // 1.50000
String(yourDouble)
.
let double = 1.5
let string = double.description
actualizar Xcode 7.1 • Swift 2.1:
Ahora Double también es convertible a String, por lo que simplemente puede usarlo como desee:
let double = 1.5
let doubleString = String(double) // "1.5"
Swift 3 o posterior podemos extenderlo LosslessStringConvertible
y hacerlo genérico
Xcode 11.3 • Swift 5.1 o posterior
extension LosslessStringConvertible {
var string: String { .init(self) }
}
let double = 1.5
let string = double.string // "1.5"
Para un número fijo de dígitos fraccionarios, podemos extender el FloatingPoint
protocolo:
extension FloatingPoint {
func fixedFraction(digits: Int) -> String {
return String(format: "%.*f", digits, self as! CVarArg)
}
}
Si necesita más control sobre el formato de su número (dígitos de fracción mínima y máxima y modo de redondeo) puede usar NumberFormatter:
extension Formatter {
static let number = NumberFormatter()
}
extension FloatingPoint {
func fractionDigits(min: Int = 2, max: Int = 2, roundingMode: NumberFormatter.RoundingMode = .halfEven) -> String {
Formatter.number.minimumFractionDigits = min
Formatter.number.maximumFractionDigits = max
Formatter.number.roundingMode = roundingMode
Formatter.number.numberStyle = .decimal
return Formatter.number.string(for: self) ?? ""
}
}
2.12345.fractionDigits() // "2.12"
2.12345.fractionDigits(min: 3, max: 3, roundingMode: .up) // "2.124"
String(format: "%.\(digits)f", self as! CVarArg)
conString(format: "%.*f", digits, self as! CVarArg)
Además de la respuesta de @Zaph, puede crear extension:
extension Double {
func toString() -> String {
return String(format: "%.1f",self)
}
}
Uso:
var a:Double = 1.5
println("output: \(a.toString())") // output: 1.5
a.toString()
es vista por otro desarrollador definitivamente habrá un momento WTF.
myToString()
para asegurarse de que su definición personalizada. Pero al igual que en otros lenguajes, la creación de prototipos evita la duplicación de código y un buen mantenimiento.
println("output: \(a.toString())")
y println("output: \(a)")
. La segunda opción no causa errores de compilación. ¿Es esta opción una mala práctica?
yourDouble?.toString() ?? ""
Swift 3+: prueba estas líneas de código
let num: Double = 1.5
let str = String(format: "%.2f", num)
Swift 4 : use el siguiente código
let number = 2.4
let string = String(format: "%.2f", number)
Esta función le permitirá especificar el número de posiciones decimales para mostrar:
func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}
Uso:
let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)
String(format:"%."+numberOfDecimalPlaces.description+"f", number)
conString(format:"%.*f", numberOfDecimalPlaces, number)
Aquí hay muchas respuestas que sugieren una variedad de técnicas. Pero al presentar números en la interfaz de usuario, invariablemente desea utilizar un NumberFormatter
para que los resultados estén formateados, redondeados y localizados correctamente:
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.5
Si desea un número fijo de decimales, por ejemplo, para valores de moneda
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.50
Pero la belleza de este enfoque es que estará correctamente localizado, lo que resultará en 10,000.50
Estados Unidos pero 10.000,50
en Alemania. Las diferentes configuraciones regionales tienen diferentes formatos preferidos para los números, y debemos permitir que NumberFormatter
usemos el formato preferido por el usuario final al presentar valores numéricos dentro de la interfaz de usuario.
No hace falta decir que, si bien NumberFormatter
es esencial al preparar representaciones de cadenas dentro de la interfaz de usuario, no debe usarse si se escriben valores numéricos como cadenas para almacenamiento persistente, interfaz con servicios web, etc.
En Swift 3 es simple como se indica a continuación
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
para mí.
var b = String(stringInterpolationSegment: a)
Esto funciona para mi. Puede intentarlo
En Swift 4, si desea modificar y usar un Double en la interfaz de usuario como una etiqueta de texto "String", puede agregar esto al final de su archivo:
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
Y utilícelo así si desea tenerlo en una etiqueta de texto:
currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"
O imprímalo como un Int:
print(weatherData.tempCelsius.roundToInt())
Preferiría el enfoque NSNumber y NumberFormatter (donde sea necesario), también puede usar la extensión para evitar el código hinchado
extension Double {
var toString: String {
return NSNumber(value: self).stringValue
}
}
U también puede necesitar un enfoque inverso
extension String {
var toDouble: Double {
return Double(self) ?? .nan
}
}
LossLessStringConvertible
protocolo en lugar de extender Double extension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5 : use el siguiente código
extension Double {
func getStringValue(withFloatingPoints points: Int = 0) -> String {
let valDouble = modf(self)
let fractionalVal = (valDouble.1)
if fractionalVal > 0 {
return String(format: "%.*f", points, self)
}
return String(format: "%.0f", self)
}
}
String(format: "%.\(points)f", self)
conString(format: "%.*f", points, self)
var b = "\(a)"