Respostas:
Ele não está lançando, está criando uma string a partir de um valor com um formato.
let a: Double = 1.5
let b: String = String(format: "%f", a)
print("b: \(b)") // b: 1.500000
Com um formato diferente:
let c: String = String(format: "%.1f", a)
print("c: \(c)") // c: 1.5
Você também pode omitir a format
propriedade se nenhuma formatação for necessária.
format:"%.1f" = 1 digit // 1.5
; format:"%.5f" = 5 digits // 1.50000
String(yourDouble)
.
let double = 1.5
let string = double.description
atualizar o Xcode 7.1 • Swift 2.1:
Agora Double também pode ser convertido em String para que você possa simplesmente usá-lo como desejar:
let double = 1.5
let doubleString = String(double) // "1.5"
Swift 3 ou posterior , podemos estender LosslessStringConvertible
e torná-lo genérico
Xcode 11.3 • Swift 5.1 ou posterior
extension LosslessStringConvertible {
var string: String { .init(self) }
}
let double = 1.5
let string = double.string // "1.5"
Para um número fixo de dígitos fracionários, podemos estender o FloatingPoint
protocolo:
extension FloatingPoint {
func fixedFraction(digits: Int) -> String {
return String(format: "%.*f", digits, self as! CVarArg)
}
}
Se precisar de mais controle sobre o formato de número (dígitos de fração mínimo e máximo e modo de arredondamento), você pode 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)
porString(format: "%.*f", digits, self as! CVarArg)
Além da resposta @Zaph, você pode criar 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()
for vista por outro desenvolvedor definitivamente haverá um momento WTF.
myToString()
para ter certeza de que sua definição personalizada. Mas, como em outras linguagens, a prototipagem evita a duplicação de código e uma boa manutenção.
println("output: \(a.toString())")
e println("output: \(a)")
. A segunda opção não causa erros de compilação. Esta opção é uma má prática?
yourDouble?.toString() ?? ""
Swift 3+: experimente estas linhas de código
let num: Double = 1.5
let str = String(format: "%.2f", num)
Swift 4 : use o seguinte código
let number = 2.4
let string = String(format: "%.2f", number)
Esta função permitirá que você especifique o número de casas decimais a serem mostradas:
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)
porString(format:"%.*f", numberOfDecimalPlaces, number)
Existem muitas respostas aqui que sugerem uma variedade de técnicas. Mas ao apresentar números na IU, você invariavelmente deseja usar um NumberFormatter
para que os resultados sejam formatados, arredondados e localizados corretamente:
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 você quiser um número fixo de casas decimais, por exemplo, para valores monetários
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
Mas a beleza dessa abordagem é que ela será adequadamente localizada, resultando nos 10,000.50
Estados Unidos, mas 10.000,50
na Alemanha. Localidades diferentes têm formatos preferenciais diferentes para números e devemos permitir o NumberFormatter
uso do formato preferido pelo usuário final ao apresentar valores numéricos na IU.
Desnecessário dizer que, embora NumberFormatter
seja essencial ao preparar representações de string dentro da IU, não deve ser usado se estiver escrevendo valores numéricos como strings para armazenamento persistente, interface com serviços da web, etc.
No Swift 3 é simples, conforme mostrado abaixo
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
para mim.
var b = String(stringInterpolationSegment: a)
Isso funciona para mim. Você pode tentar
No Swift 4, se você quiser modificar e usar um Double na IU como um textLabel "String", você pode adicionar isso no final do seu arquivo:
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
E use-o assim se quiser que seja em um rótulo de texto:
currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"
Ou imprima-o como um Int:
print(weatherData.tempCelsius.roundToInt())
Eu preferiria a abordagem NSNumber e NumberFormatter (quando necessário), também você pode usar a extensão para evitar o inchaço do código
extension Double {
var toString: String {
return NSNumber(value: self).stringValue
}
}
Você também pode precisar de abordagem reversa
extension String {
var toDouble: Double {
return Double(self) ?? .nan
}
}
LossLessStringConvertible
protocolo em vez de estender Duplo extension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5 : use o seguinte 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)
porString(format: "%.*f", points, self)
var b = "\(a)"