快速双绳

在更新 xCode6之前,将 double 强制转换为字符串没有任何问题,但是现在它给了我一个错误

var a: Double = 1.5
var b: String = String(a)

它给我一个错误消息“ double 不能转换成 string”。还有其他方法吗?

190263 次浏览

它不是强制转换,而是从具有格式的值创建字符串。

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属性。

除了 @ Zaph 的回答,你还可以在 Double上创建一个 extension:

extension Double {
func toString() -> String {
return String(format: "%.1f",self)
}
}

用法:

var a:Double = 1.5
println("output: \(a.toString())")  // output: 1.5
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 where Self: CVarArg {
func fixedFraction(digits: Int) -> String {
.init(format: "%.*f", digits, self)
}
}

如果你需要更多的控制你的数字格式(最小和最大分数数字和四舍五入模式) ,你可以使用 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"

这个函数将允许您指定要显示的小数位数:

func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}

用法:

let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)

除了枚举值之外的任何字符串都可以简单地执行 println ()方法中的操作

例如:

var stringOfDBL = "\(myDouble)"
var b = String(stringInterpolationSegment: a)

这对我有用,你可以试试

快速3:

var a: Double = 1.5
var b: String = String(a)

在快速3中,它简单如下

let stringDouble =  String(describing: double)

Swift 3 + : 尝试以下代码行

let num: Double = 1.5


let str = String(format: "%.2f", num)

斯威夫特4: 使用以下代码

let number = 2.4
let string = String(format: "%.2f", number)

在 Swift 4中,如果你想在 UI 中修改并使用一个 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
}


}

斯威夫特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)
}
}

这里有许多答案,提出了各种各样的技巧。但是,当在 UI 中显示数字时,您总是希望使用 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 中显示数字值时首选的格式。

不用说,当在 UI 中准备字符串表示时,NumberFormatter是必不可少的,但是如果将数值写成字符串用于持久存储、与 Web 服务的接口等,则不应该使用 NumberFormatter

实际上你不应该对字符串进行双精度类型转换,对字符串进行浮点类型转换最常见的原因是为了向用户显示浮点数,但浮点数不是实数,只能近似大量值,类似于1.3不能表示为小数位数有限的十进制数。相反,应该将值保留为 float,以便使用它们,然后当您希望将它们显示给用户时,使用 NumberFormater 之类的东西将它们转换为。转换为用户表示的这个阶段是类似 viewModel 应该做的事情。

用这个。 文本(字符串(格式: “% 2 f”,doubleValue))