在我更新了xCode 6之前,将double强制转换为字符串没有任何问题,但现在会出错。
var a: Double = 1.5
var b: String = String(a)
我收到了"doule不可转换为string"的错误信息。是否有其他方法可以实现这个目的?
它不是类型转换,而是使用格式创建一个字符串值。
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位数字 // 1.5
;format:"%.5f" = 5位数字 // 1.50000
。 - MegaetronString(yourDouble)
即可。 - Alexandre G.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"
String(format: "%.*f", digits, self as! CVarArg)
替换 String(format: "%.\(digits)f", self as! CVarArg)
。 - rmaddy除了@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
a.toString()
时,肯定会有一个WTF时刻。 - zaphmyToString()
,以确保它是自定义定义。但是,就像在其他语言中一样,原型设计有助于避免代码重复和良好的维护。 - Maxim Shoustinprintln("output: \(a.toString())")
和 println("output: \(a)")
有什么区别?第二个选项不会导致编译错误。这个选项是不好的实践吗? - Alex Guerreroextension Optional where Wrapped: LosslessStringConvertible {
var string: String {
guard let unwrapped = self else { return "" }
return .init(unwrapped)
}
}
- Leo DabusSwift 3+:尝试这些代码
let num: Double = 1.5
let str = String(format: "%.2f", num)
要在Swift中将任何东西转换为字符串(除了枚举值),只需像在println()方法中一样操作即可。
例如:
var stringOfDBL = "\(myDouble)"
这里有很多回答建议使用各种技术。但是在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 服务接口等方面作为字符串时不应使用它。
func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}
使用方法:
let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)
String(format:"%.*f", numberOfDecimalPlaces, number)
替换String(format:"%."+numberOfDecimalPlaces.description+"f", number)
。 - rmaddySwift 4: 使用以下代码
let number = 2.4
let string = String(format: "%.2f", number)
var a: Double = 1.5
var b: String = String(a)
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) } }
- Leo Dabus
var b = "\(a)"
这样的语法也许很有用。 - erdekhayser