Ответы:
Это не приведение, это создание строки из значения с форматом.
let a: Double = 1.5
let b: String = String(format: "%f", a)
print("b: \(b)") // b: 1.500000
В другом формате:
let c: String = String(format: "%.1f", a)
print("c: \(c)") // c: 1.5
Вы также можете опустить format
свойство, если форматирование не требуется.
format:"%.1f" = 1 digit // 1.5
; format:"%.5f" = 5 digits // 1.50000
String(yourDouble)
.
let double = 1.5
let string = double.description
обновить Xcode 7.1 • Swift 2.1:
Теперь Double также можно преобразовать в String, поэтому вы можете просто использовать его по своему усмотрению:
let double = 1.5
let doubleString = String(double) // "1.5"
Swift 3 или новее мы можем расширить LosslessStringConvertible
и сделать его универсальным
Xcode 11.3 • Swift 5.1 или новее
extension LosslessStringConvertible {
var string: String { .init(self) }
}
let double = 1.5
let string = double.string // "1.5"
Для фиксированного количества цифр дроби мы можем расширить FloatingPoint
протокол:
extension FloatingPoint {
func fixedFraction(digits: Int) -> String {
return String(format: "%.*f", digits, self as! CVarArg)
}
}
Если вам нужен больший контроль над форматом чисел (минимальные и максимальные цифры дробной части и режим округления), вы можете использовать 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)
наString(format: "%.*f", digits, self as! CVarArg)
В дополнение к ответу @Zaph вы можете создать extension:
extension Double {
func toString() -> String {
return String(format: "%.1f",self)
}
}
Использование:
var a:Double = 1.5
println("output: \(a.toString())") // output: 1.5
a.toString()
увидит другой разработчик, определенно будет момент WTF.
myToString()
убедиться, что его собственное определение. Но, как и в случае с другими языками, создание прототипов позволяет избежать дублирования кода и обеспечить хорошее обслуживание.
println("output: \(a.toString())")
и println("output: \(a)")
. Второй вариант не вызывает ошибок компиляции. Это плохая практика?
yourDouble?.toString() ?? ""
Swift 4 : используйте следующий код
let number = 2.4
let string = String(format: "%.2f", number)
Эта функция позволит вам указать количество отображаемых десятичных знаков:
func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}
Использование:
let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)
String(format:"%."+numberOfDecimalPlaces.description+"f", number)
наString(format:"%.*f", numberOfDecimalPlaces, number)
Здесь есть много ответов, предлагающих самые разные методы. Но при представлении чисел в пользовательском интерфейсе вы всегда хотите использовать, NumberFormatter
чтобы результаты были правильно отформатированы, округлены и локализованы:
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.5
Если вам нужно фиксированное количество десятичных знаков, например, для денежных значений
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
Но прелесть этого подхода в том, что он будет правильно локализован, в результате чего в 10,000.50
США будет 10.000,50
Германия. В разных регионах используются разные предпочтительные форматы чисел, и мы должны позволить NumberFormatter
использовать формат, предпочитаемый конечным пользователем, при представлении числовых значений в пользовательском интерфейсе.
Излишне говорить, что, хотя NumberFormatter
это важно при подготовке строковых представлений в пользовательском интерфейсе, его не следует использовать при записи числовых значений в виде строк для постоянного хранения, интерфейса с веб-службами и т. Д.
В Swift 3 это просто, как показано ниже
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
для меня.
var b = String(stringInterpolationSegment: a)
У меня это работает. Вы можете попробовать
В Swift 4, если вы хотите изменить и использовать Double в пользовательском интерфейсе в качестве textLabel «String», вы можете добавить это в конец файла:
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
И используйте это так, если хотите, чтобы это было в текстовой метке:
currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"
Или распечатайте его как Int:
print(weatherData.tempCelsius.roundToInt())
Я бы предпочел подход NSNumber и NumberFormatter (где необходимо), также вы можете использовать расширение, чтобы избежать раздувания кода
extension Double {
var toString: String {
return NSNumber(value: self).stringValue
}
}
U может также потребоваться обратный подход
extension String {
var toDouble: Double {
return Double(self) ?? .nan
}
}
LossLessStringConvertible
протоколом расширения вместо расширения Double extension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5 : используйте следующий код
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)
наString(format: "%.*f", points, self)
var b = "\(a)"