无法将 Double 转换为 String

Posted

技术标签:

【中文标题】无法将 Double 转换为 String【英文标题】:Cannot convert Double to String 【发布时间】:2014-09-29 05:59:25 【问题描述】:

“The Swift Programming Language”包含以下示例代码:

let label = "The width is "
let width = 94
let widthLabel = label + String(width)

当我将 width 隐式更改为 Double 时:

let width = 94.4

let widthLabel = label + String(width) 行创建了一个编译器错误:

不能使用类型为 (String, String) 的参数列表调用“+”

虽然我可以通过调用width.descriptionDouble var 转换为String,但我想知道:

    为什么String(Integer) 有效而String(Double) 无效? 在数值类型(Integer、Float、Double 等)上调用 String(var)var.description 有什么区别吗?

【问题讨论】:

***.com/questions/24031621/… ? 【参考方案1】:

您不能这样做的原因是因为String 没有接受双精度或浮点数的初始化程序,而它为所有整数类型(Int、Uint、Int32 等)实现了初始化程序。

所以@derdida 的解决方案是正确的方法。

我不鼓励使用 description 属性。它不是旨在将双精度数转换为字符串,而是提供双精度数的人类可读文本表示。因此,尽管今天的表示与转换一致:

let width = 94.5
println(width) // Prints "94.5"

明天可以换成不同的,比如:

ninety four point five

这仍然是人类可读的,但它不完全是双精度到字符串的转换。

此规则适用于所有实现Printable 协议的类型(结构、类等):description 属性应该用于描述,而不是convert。

附录

除了使用字符串插值,我们还可以使用旧的类似 c 的字符串格式化:

let pi = 3.1415
let piString = String(format: "%0.2f", arguments:[pi])

let message = "Pi is " + String(format: "%0.2f", arguments:[pi])
println(message)

【讨论】:

你比我快:) 所以要将 Double/Float 转换为 String 就像:let strVal="\(doubbleVal)"?这似乎很特殊。 您也可以使用类似 c 的字符串格式 - 请参阅更新的答案【参考方案2】:

当你想创建一个字符串值时我会使用它:

let width:Double = 94.4
let widthLabel = "The width is \(width)"

【讨论】:

但你能隐式地(即没有“:Double”声明)吗? 感谢您的指点,但我知道我可以做到。我想知道的是为什么支持 Integer 但不支持 Double/Float,String(var) 和 var.description 有什么区别 我认为支持 Ints 是因为它们的字符串表示没有歧义,而浮点数有多种表示形式和许多可能的精度。

以上是关于无法将 Double 转换为 String的主要内容,如果未能解决你的问题,请参考以下文章

无法将“String”类型的值转换为预期的参数类型“TimeInterval”(又名“Double”)

创建搜索按钮(Double无法转换为String)

无法在 Swift 中将 String 转换为 Double [重复]

在 swift 中将 String 类型数组转换为 Float 类型数组 不能将类型 'String' 的值分配给类型 'Double' 的下标。

将Double转换为String(完整数字)C#

LINQ to Entities 无法识别方法 'Double Parse(System.String)' 方法,并且此方法无法转换为存储表达式