Відповіді:
Це не кастинг, це створення рядка зі значення з форматом.
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
це є важливим при підготовці представлення рядків в інтерфейсі, він не повинен використовуватися, якщо записувати числові значення як рядки для постійного зберігання, інтерфейсу з веб-службами тощо.
У швидкому 3 це просто, як зазначено нижче
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
для мене.
У 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
}
}
Ви також можете потребувати зворотного підходу
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)"