Risposte:
Non sta eseguendo il casting, sta creando una stringa da un valore con un formato.
let a: Double = 1.5
let b: String = String(format: "%f", a)
print("b: \(b)") // b: 1.500000
Con un formato diverso:
let c: String = String(format: "%.1f", a)
print("c: \(c)") // c: 1.5
È inoltre possibile omettere la format
proprietà se non è necessaria la formattazione.
format:"%.1f" = 1 digit // 1.5
; format:"%.5f" = 5 digits // 1.50000
String(yourDouble)
.
let double = 1.5
let string = double.description
aggiornare Xcode 7.1 • Swift 2.1:
Ora Double è anche convertibile in String, quindi puoi usarlo semplicemente come desideri:
let double = 1.5
let doubleString = String(double) // "1.5"
Swift 3 o successivo possiamo estenderlo LosslessStringConvertible
e renderlo generico
Xcode 11.3 • Swift 5.1 o successivo
extension LosslessStringConvertible {
var string: String { .init(self) }
}
let double = 1.5
let string = double.string // "1.5"
Per un numero fisso di cifre frazionarie possiamo estendere il FloatingPoint
protocollo:
extension FloatingPoint {
func fixedFraction(digits: Int) -> String {
return String(format: "%.*f", digits, self as! CVarArg)
}
}
Se hai bisogno di un maggiore controllo sul formato del tuo numero (cifre frazionarie minime e massime e modalità di arrotondamento) puoi usare 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)
Oltre alla risposta di @Zaph, puoi creare 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()
viene vista da un altro sviluppatore ci sarà sicuramente un momento WTF.
myToString()
per essere sicuro che la sua definizione personalizzata. Ma come in altri linguaggi la prototipazione porta ad evitare la duplicazione del codice e una buona manutenzione.
println("output: \(a.toString())")
e println("output: \(a)")
. La seconda opzione non causa errori di compilazione. Questa opzione è una cattiva pratica?
yourDouble?.toString() ?? ""
Swift 3+: prova queste righe di codice
let num: Double = 1.5
let str = String(format: "%.2f", num)
Swift 4 : usa il seguente codice
let number = 2.4
let string = String(format: "%.2f", number)
Questa funzione ti consentirà di specificare il numero di posizioni decimali da mostrare:
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)
Ci sono molte risposte qui che suggeriscono una varietà di tecniche. Ma quando si presentano numeri nell'interfaccia utente, si desidera sempre utilizzare a in NumberFormatter
modo che i risultati siano formattati, arrotondati e localizzati correttamente:
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.5
Se si desidera un numero fisso di cifre decimali, ad esempio per i valori di valuta
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
Ma la bellezza di questo approccio è che verrà localizzato correttamente, con il risultato 10,000.50
negli Stati Uniti ma 10.000,50
in Germania. Impostazioni locali diverse hanno formati preferiti diversi per i numeri e dovremmo consentire di NumberFormatter
utilizzare il formato preferito dall'utente finale quando si presentano valori numerici all'interno dell'interfaccia utente.
Inutile dire che, sebbene NumberFormatter
sia essenziale quando si preparano rappresentazioni di stringhe all'interno dell'interfaccia utente, non dovrebbe essere utilizzato se si scrivono valori numerici come stringhe per l'archiviazione persistente, l'interfaccia con i servizi Web, ecc.
In swift 3 è semplice come indicato di seguito
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
per me.
var b = String(stringInterpolationSegment: a)
Questo funziona per me. Potresti provare
In Swift 4, se desideri modificare e utilizzare un Double nell'interfaccia utente come un'etichetta di testo "String", puoi aggiungerla alla fine del file:
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
E usalo in questo modo se ti piace averlo in un'etichetta di testo:
currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"
Oppure stampalo come Int:
print(weatherData.tempCelsius.roundToInt())
Preferirei l'approccio NSNumber e NumberFormatter (dove necessario), inoltre puoi usare l'estensione per evitare il gonfiore del codice
extension Double {
var toString: String {
return NSNumber(value: self).stringValue
}
}
Puoi anche aver bisogno di un approccio inverso
extension String {
var toDouble: Double {
return Double(self) ?? .nan
}
}
LossLessStringConvertible
protocollo invece di estendere Double extension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5 : usa il seguente codice
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)"