Answers:
它不是强制转换,而是根据具有格式的值创建字符串。
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 3+:尝试以下代码行
let num: Double = 1.5
let str = String(format: "%.2f", num)
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)
这里有许多答案建议了多种技术。但是,在用户界面中显示数字时,您总是希望使用a,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
在UI中显示数字值时,我们应该使用最终用户首选的格式。
不用说,虽然NumberFormatter
在UI中准备字符串表示形式是必不可少的,但是如果将数字值作为字符串写入以进行持久存储,与Web服务接口等,则不应使用它。
在swift 3中,如下所示很简单
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
对我来说是回报。
var b = String(stringInterpolationSegment: a)
这对我有用。你可以试试看
在Swift 4中,如果您想在UI中修改并使用Double作为textLabel“ String”,则可以在文件末尾添加:
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
如果您希望将其包含在textlabel中,请像这样使用它:
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)"