如何在 swift 中将可选的十进制类型转换为字符串

how to convert optional decimal type to String in swift

提问人:jacobcan118 提问时间:11/16/2023 更新时间:11/16/2023 访问量:55

问:

我有一个变量作为可选的十进制类型,如果它为零,我想转换为另一个类型变量,更改为空字符串,否则转换为字符串值。但是我收到错误 错误:String""Binary operator '??' cannot be applied to operands of type 'Decimal?' and 'String'

let iAmNil: Decimal? = nil
let iAmDecimal: Decimal? = 12.34
print(String(describing: iAmDecimal ?? ""))
迅速

评论

0赞 vadian 11/16/2023
为什么不是最明显的而不是处理?print(iAmDecimal?.formatted() ?? "")Any

答:

2赞 Alexander 11/16/2023 #1

正如错误所表明的那样,您正在错误地应用您的级别。您正在尝试为可选的 Decimal 提供字符串 default ()。那行不通。??""

您需要有条件地将 转换为 ,然后为其提供默认值。Decimal?String?

最简单的方法是使用 Optional.map(_:):

import Foundation

let iAmNil: Decimal? = nil
let iAmDecimal: Decimal? = 12.34

print(iAmNil.map { String(describing: $0) } ?? "nil")
print(iAmDecimal.map { String(describing: $0) } ?? "nil")

(我用来代替显示它实际上在输出中工作)"nil"""

但是,当然,您永远不应该用于为用户设置数字格式。确保您使用的是区域设置感知工具,例如 ,这些工具实际上可以正确地执行此操作。String(describing:)NumberFormatter

评论

0赞 jacobcan118 11/16/2023
那么为什么有效呢?let iAmDecimal: Double? = 12.34 print(iAmDecimal ?? "")
1赞 trojanfoe 11/16/2023
@jacobcan118 因为接受作为其第一个参数。出于同样的原因,这也有效。print()Anylet x: Any = iAmDecimal ?? ""
0赞 Alexander 11/17/2023
@jacobcan118 您的问题得到解答了吗?
0赞 trojanfoe 11/16/2023 #2

如果将转换转换为 ,那么这将起作用,因为编译器很高兴可以使用以下任一:AnyDecimalString

import Foundation

let iAmNil: Decimal? = nil
let iAmDecimal: Decimal? = 12.34
print(String(describing: (iAmDecimal ?? "") as Any))
// Prints 12.34\n